RocketMQ 支持 3种消息发送方式 :同步(sync)、 异步(async)、单向( oneway )。
同步:发送者向 MQ 执行发送消息 API 时,同步等待,直到消息服务器返回发送结果。
异步:发送者向 MQ 执行发送消息 API 时,指定消息发送成功后的回掉函数,然后调 用消息发送 API 后,立即返回,消息发送者线程不阻塞 ,直到运行结束,消息发送成功或失败的回调任务在一个新的线程中执行
单向:消息发送者向 MQ 执行发送消息API时,直接返回,不等待消息服务器的结果,也不注册回调函数,简单地说,就是只管发,不在乎消息是否成功存储在消息服务器上。
消息生产者的启动流程:
消息生产者的启动方法在DefaultMQProducerlmpl的start方法来跟踪:
1、检查 productGroup 是否符合要求;并改变生产者的 instanceName 为进程 ID
this.checkConfig();
if(!this.defaultMQProducer.getProducerGroup().
equals(MixAll.CLIENT_INNER_PRODUCER_GROUP)){
this.defaultMQProducer.changeInstanceNameToPID();
}
2、创建MQClientInstance实例。整个JVM实例中只存在一个 MQClientManager实 例,维护 MQClientlnstance 缓存表 ConcurrentMap<String/clientld/, MQClientinstance> factoryTable =new ConcurrentHashMap<String,MQClinetInstance>(),也就是同一个clientId只会创建一个MQClientInstance。
publicMQClientInstancegetAndCreateMQClientInstance(finalClientConfigclientConfig,RPCHookrpcHook){
StringclientId=clientConfig.buildMQClientId();
MQClientInstanceinstance=this.factoryTable.get(clientId);
if(null==instance){
instance=
newMQClientInstance(clientConfig.cloneClientConfig(),
this.factoryIndexGenerator.getAndIncrement(),clientId,rpcHook);
MQClientInstanceprev=this.factoryTable.putIfAbsent(clientId,instance);
if(prev!=null){
instance=prev;
log.warn("ReturnedPreviousMQClientInstanceforclientId:[{}]",clientId);
}else{
log.info("CreatednewMQClientInstanceforclientId:[{}]",clientId);
}
}
returninstance;
}
3、向 MQClientlnstance 注册,将当前生产者加入到 MQClientlnstance 管理中,方 便后续调用网络请求、进行心跳检测等
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);
}
4、启动 MQClientlnstance ,如果 MQClientlnstance已经启动 ,则本次启动不会真正执行