RocketMq源码解读-producer启动
producer启动
1.ExtProducerResetConfiguration
注册额外的producer
注册@ExtRocketMQTemplateConfiguration修饰的bean(必许继承RocketMQTemplate)
2.RocketMQAutoConfiguration
1.读取配置创建producer bean
2.创建rocketMQTemplate 注入 producer
3.核心方法 createDefaultMQProducer
二者都会通过 createDefaultMQProducer 创建producer实例
1.producer实现类均为TransactionMQProducer
2.如果开启了isEnableAcl则注册AclClientRPCHook,在doBeforeRequest中进行acl校验
3.如果开启了isEnableMsgTrace则创建AsyncTraceDispatcher,内部创建了一个线程池
注册sendMessageHook,在发送消息前后构建traceBean,加入到TraceDispatcher中的traceContextQueue中等待被消费
4.填充其他信息
RocketMQAutoConfiguration
ExtProducerResetConfiguration
区别:
1.RocketMQAutoConfiguration中可以设置accessChannel
LOCAL表示本地部署的服务
CLOUD表示远程服务(阿里云)
2.ExtProducerResetConfiguration可通过注解覆盖配置文件中的信息
至此,producer实例创建完毕。
5.producer.start()
5.1 实例启动
public void start(final boolean startFactory) throws MQClientException {
switch (this.serviceState) {
//1
case CREATE_JUST:
//2
this.serviceState = ServiceState.START_FAILED;
//3
this.checkConfig();
//4
if (!this.defaultMQProducer.getProducerGroup().equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)) {
this.defaultMQProducer.changeInstanceNameToPID();
}
//5
this.mQClientFactory = MQClientManager.getInstance().getOrCreateMQClientInstance(this.defaultMQProducer, rpcHook);
//6
boolean registerOK = 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(FAQUrl.GROUP_NAME_DUPLICATE_URL),
null);
}
//7
this.topicPublishInfoTable.put(this.defaultMQProducer.getCreateTopicKey()