前言:本篇将从启动,Producer发送不同类型的消息的逻辑等方面,来深入了解。
(一)启动
在应用层初始化DefaultMQProducer时候,会以Producer名或者RPCHook的任一个或两个作为参数初始化DefaultMQProducer对象,然后对DefaultMQProducer对象设置NameServer地址等参数,然后调用start方法启动Producer,其实内部调用了DefaultMQProducerImpl.start 方法。大致逻辑如下:
1、检查 DefaultMQProducerImpl.ServiceState 的状态(初始化状态为
ServiceState.CREATE_JUST);只有状态为 CREATE_JUST 时才启动该Producer;
其他状态均不执行启动过程;
2、 将 DefaultMQProducerImpl.ServiceState 置为 start_failed,以免客户端同一个进程中重复启动
3、检查 producerGroup 是否合法
4、 若 producerGroup 不等于“ CLIENT_INNER_PRODUCER”则设置 Producer的实例名( instanceName);
5、 构建该 Producer 的 ClientID,等于 IP 地址@instanceName;
6,创建 MQClientInstance 对象。如果该ClientID对应的MQClientInstance存在则直接返回。说明一个 IP 客户端下面的应用,只有在启动多个进程的情况下才会创建多个 MQClientInstance 对象;
7、 将 DefaultMQProducerImpl 对象在 MQClientInstance 中注册,以producerGroup 为 key 值、 DefaultMQProducerImpl 对象为 values 值存入
8、以主题名“ TBW102”为 key 值,新初始化的 TopicPublishInfo 对象为 value值存入 DefaultMQProducerImpl.topicPublishInfoTable 变量中;
9、 入参 startFactory 等于 true, 故调用 MQClientInstance.start 方法启
动 MQClientInstance 对象;
10、设置 DefaultMQProducerImpl 的 ServiceState 为 RUNNING;
11、立即调用 MQClientInstance.sendHeartbeatToAllBrokerWithLock()方
法
(二)向Broker发送心跳消息
1、初始化 HeartbeatData 对象,将该 Producer 或 Consumer 的 ClientID 赋值给 HeartbeatData 对象的 clientID 变量;