RocketMQ Producer 启动时干了哪些事

版本:4.2.0

producer启动代码

​
public void start(boolean startFactory) throws MQClientException {
    switch(this.serviceState) {
        case CREATE_JUST:
            this.serviceState = ServiceState.START_FAILED;
            //检查producerGroup
            this.checkConfig();
            if (!this.defaultMQProducer.getProducerGroup().equals("CLIENT_INNER_PRODUCER")) {
                this.defaultMQProducer.changeInstanceNameToPID();
            }
            //生成一个MQClientInstance实例
            this.mQClientFactory = MQClientManager.getInstance().getAndCreateMQClientInstance(this.defaultMQProducer, this.rpcHook);
            //注册到table中
            boolean registerOK = this.mQClientFactory.registerProducer(this.defaultMQProducer.getProducerGroup(), this);
            if (!registerOK) {
                this.serviceState = ServiceState.CREATE_JUST;
                throw new MQClientException("The producer group[" + this.defaultMQProducer.getProducerGroup() + "] has been created before, specify another name please." + FAQUrl.suggestTodo("http://rocketmq.apache.org/docs/faq/"), (Throwable)null);
            } else {
                //注册默认topic信息,定时任务会从nameServer拉取信息并更新
                 this.topicPublishInfoTable.put(this.defaultMQProducer.getCreateTopicKey(), new TopicPublishInfo());
                if (startFactory) {
                    //启动相关的组件、定时任务
                    this.mQClientFactory.start();
                }
​
                this.log.info("the producer [{}] start OK. sendMessageWithVIPChannel={}", this.defaultMQProducer.getProducerGroup(), this.defaultMQProducer.isSendMessageWithVIPChannel());
                this.serviceState = ServiceState.RUNNING;
            }
        default:
            this.mQClientFactory.sendHeartbeatToAllBrokerWithLock();
            return;
        case RUNNING:
        case START_FAILED:
        case SHUTDOWN_ALREADY:
            throw new MQClientException("The producer service state not OK, maybe started once, " + this.serviceState + FAQUrl.suggestTodo("http://rocketmq.apache.org/docs/faq/"), (Throwable)null);
    }
}

MQClientInstance是什么呢?

public MQClientInstance(ClientConfig clientConfig, int instanceIndex, String clientId, RPCHook rpcHook) {
    this.log = ClientLogger.getLog();
    this.bootTimestamp = System.currentTimeMillis();
    this.producerTable = new ConcurrentHashMap();
    this.consumerTable = new ConcurrentHashMap();
    this.adminExtTable = new ConcurrentHashMap();
    this.topicRouteTable = new ConcurrentHashMap();
    this.lockNamesrv = new ReentrantLock();
    this.lockHeartbeat = new ReentrantLock();
    this.brokerAddrTable = new ConcurrentHashMap();
    this.brokerVersionTable = new ConcurrentHashMap();
    this.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() {
        public Thread newThread(Runnable r) {
            return new Thread(r, "MQClientFactoryScheduledThread");
        }
    });
    this.sendHeartbeatTimesTotal = new AtomicLong(0L);
    this.serviceState = ServiceState.CREATE_JUST;
    this.random = new Random();
    this.clientConfig = clientConfig;
    this.instanceIndex = instanceIndex;
    this.nettyClientConfig = new NettyClientConfig();
    this.nettyClientConfig.setClientCallbackExecutorThreads(clientConfig.getClientCallbackExecutorThreads());
    this.nettyClientConfig.setUseTLS(clientConfig.isUseTLS());
    this.clientRemotingProcessor = new ClientRemotingProcessor(this);
    // MQClientAPIImpl初始化会生成NettyRemotingClient
    this.mQClientAPIImpl = new MQClientAPIImpl(this.nettyClientConfig, this.clientRemotingProcessor, rpcHook, clientConfig);
    if (this.clientConfig.getNamesrvAddr() != null) {
        this.mQClientAPIImpl.updateNameServerAddressList(this.clientConfig.getNamesrvAddr());
        this.log.info("user specified name server address: {}", this.clientConfig.getNamesrvAddr());
    }
​
    this.clientId = clientId;
    this.mQAdminImpl = new MQAdminImpl(this);
    this.pullMessageService = new PullMessageService(this);
    this.rebalanceService = new RebalanceService(this);
    this.defaultMQProducer = new DefaultMQProducer("CLIENT_INNER_PRODUCER");
    this.defaultMQProducer.resetClientConfig(clientConfig);
    this.consumerStatsManager = new ConsumerStatsManager(this.scheduledExecutorService);
}

从初始化可以看出来MQClientInstance是producer的核心,包括了brokerAddr、topic路由信息、netty组件、拉取消息组件、消费端messageQueue均衡组件等等。拉取消息和mq均衡是consumer的核心功能。

那么MQClientInstance启动的时候又做了什么呢?

public void start() throws MQClientException {
    synchronized(this) {
        switch(this.serviceState) {
            case CREATE_JUST:
                this.serviceState = ServiceState.START_FAILED;
                if (null == this.clientConfig.getNamesrvAddr()) {
                    this.mQClientAPIImpl.fetchNameServerAddr();
                }
                // 启动netty组件
                this.mQClientAPIImpl.start();
                // 启动定时任务
                this.startScheduledTask();
                。。。
                this.log.info("the client factory [{}] start OK", this.clientId);
                this.serviceState = ServiceState.RUNNING;
            case RUNNING:
            case SHUTDOWN_ALREADY:
            default:
                return;
            case START_FAILED:
                throw new MQClientException("The Factory object[" + this.getClientId() + "] has been created before, and failed.", (Throwable)null);
        }
    }
}

定时任务

private void startScheduledTask() {
    if (null == this.clientConfig.getNamesrvAddr()) {
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
            public void run() {
                try {
                    // 定时抓取nameServer的地址
                    MQClientInstance.this.mQClientAPIImpl.fetchNameServerAddr();
                } catch (Exception var2) {
                    MQClientInstance.this.log.error("ScheduledTask fetchNameServerAddr exception", var2);
                }
​
            }
        }, 10000L, 120000L, TimeUnit.MILLISECONDS);
    }
​
    this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        public void run() {
            try {
                // 定时请求nameServer拉取TopicRouteData并更新本地缓存列表
                MQClientInstance.this.updateTopicRouteInfoFromNameServer();
            } catch (Exception var2) {
                MQClientInstance.this.log.error("ScheduledTask updateTopicRouteInfoFromNameServer exception", var2);
            }
​
        }
    }, 10L, (long)this.clientConfig.getPollNameServerInterval(), TimeUnit.MILLISECONDS);
    this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
        public void run() {
            try {
                // 定时清理下线的broker
                MQClientInstance.this.cleanOfflineBroker();
                // 定时向在线的broker master发送心跳包
                MQClientInstance.this.sendHeartbeatToAllBrokerWithLock();
            } catch (Exception var2) {
                MQClientInstance.this.log.error("ScheduledTask sendHeartbeatToAllBroker exception", var2);
            }
​
        }
    }, 1000L, (long)this.clientConfig.getHeartbeatBrokerInterval(), TimeUnit.MILLISECONDS);
    。。。
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、rocketmq入门到精通视频教程目录大纲 001-001_RocketMQ_简介 002-002_RocketMQ_核心概念详解 003-003_RocketMQ_集群构建模型详解(一) 004-004_RocketMQ_集群构建模型详解(二) 005-005_RocketMQ_双主模式集群环境搭建 006-006_RocketMQ_控制台使用讲解 007-007_RocketMQ_Broker配置文件详解 008-008_RocketMQ_helloworld示例讲解 009-009_RocketMQ_整体架构概述详解 010-010_RocketMQ_Producer_API详解 011-011_RocketMQ_Producer_顺序消费机制详解 012-012_RocketMQ_Producer_务消息机制详解 013-013_RocketMQ_Consumer_Push和Pull模式及使用详解 014-014_RocketMQ_Consumer_配置参数详解 015-015_RocketMQ_Consumer_重试策略详解 016-016_RocketMQ_Consumer_幂等去重策略详解 017-017_RocketMQ_消息模式 及使用讲解 018-018_RocketMQ_双主双从集群环境搭建与使用详解 019-019_RocketMQ_FilterServer机制及使用详解 020-020_RocketMQ_管理员命令 二、rocketmq实战视频教程目录大纲 01_rocketmq_实战项目介绍 02_rocketMQ实战项目设计(一) 03_rocketMQ实战项目设计(二) 04_rocketMQ实战-环境搭建(一) 05_rocketMQ实战-环境搭建(二) 06_rocketMQ实战-生产者与spring结合 07_rocketMQ实战-消费者与spring结合 08_rocketMQ实战-数据库模型设计 09_rocketMQ实战-数据库DAO代码生成 10_rocketMQ实战-远程RPC接口设计与实现(一) 11_rocketMQ实战-远程RPC接口设计与实现(二) 12_rocketMQ实战-远程RPC接口设计与实现(三) 13_rocketMQ实战-下单流程(一) 14_rocketMQ实战-下单流程(二) 15_rocketMQ实战-下单流程(三) 16_rocketMQ实战-下单流程(四) 17_rocketMQ实战-下单流程(五) 18_rocketMQ实战-下单流程(六) 19_rocketMQ实战-下单流程(七) 20_rocketMQ实战-下单流程(八)-商品库存 21_rocketMQ实战-下单流程(九)-商品库存 22_rocketMQ实战-下单流程(十)-支付模块 23_rocketMQ实战-整体联调

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值