RocketMQ发送消息流程如下
DefaultMQProducer实现增加了RPCHook,RPCHook用于拦截请求和响应
DefaultMQProducer.send
defaultMQProducerImpl.send --- 默认同步发送
this.sendDefaultImpl
this.tryToFindTopicPublishInfo --- 获取topic路由 默认4个messageQueue
----- 选择MessageQueue 发送消息;同步策略尝试3次,失败会记录MessageQueue,用于下次重试排除
this.selectOneMessageQueue
defaultMQProducer.withNamespace --- 重试的时候重新设置topic
this.sendKernelImpl ---- 发送消息
mQClientFactory.findBrokerAddressInPublish ---- 查找broker地址
MixAll.brokerVIPChannel --- 是否转换成vip vip:端口-2
hasCheckForbiddenHook --- CheckForbiddenHook
this.executeCheckForbiddenHook
this.hasSendMessageHook --- SendMessageHook
this.executeSendMessageHookBefore
--- 同步发送消息 逻辑 ---
mQClientFactory.getMQClientAPIImpl().sendMessage
this.sendMessageSync
remotingClient.invokeSync
doBeforeRpcHooks --- RPCHook
this.invokeSyncImpl --- netty发送请求
new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
processMessageReceived
processResponseCommand
doAfterRpcHooks --- RPCHook
this.processSendResponse --- 请求结果
this.hasSendMessageHook ---是否有后置拦截请求,即SendMessageHook
this.executeSendMessageHookAfter
--- 异步发送逻辑
mQClientFactory.getMQClientAPIImpl().sendMessage
this.sendMessageAsync
remotingClient.invokeAsync
this.invokeAsyncImpl
doBeforeRpcHooks
this.invokeAsyncImpl
new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
processMessageReceived
processResponseCommand
executeInvokeCallback --- InvokeCallback.operationComplete
MQClientAPIImpl.this.processSendResponse
sendCallback.onSuccess --- sendCallback不为空,SendCallback用于监控异步发送消息成功/异常处理
--- oneWay 逻辑
mQClientFactory.getMQClientAPIImpl().sendMessage
remotingClient.invokeOneway
doBeforeRpcHooks
this.invokeOnewayImpl
new NettyClientHandler.channelRead0 --- Neety 等待请求结果,处理结果
processMessageReceived
processResponseCommand
RocketMQ发送消息类图如下