【源码解析6】Producer发送Message流程源码解析

49 阅读2分钟

send代码解析

我们进入send函数一看究竟 image.png

给topic追加上命名空间,然后调用默认的生产者实现类中的send方法 image.png

RocketMQ源码大量使用重载,本次重载追加上了默认的投递超时时间 image.png

这里调用真正的默认消息投递方法,这里插播讲一下RocketMQ投递的三种方式:
SYNC:Producer发送Message后,需要Broker回复之后,才会发送下一条消息
ASYNC:Producer发送Message后,不需要等待Broker回复,通过回调的方式等待Broker的响应
ONEWAY:Producer发送Message后,不需要等待Broker回复,也不需要通过回调处理Broker的响应。性能很好,日志收集场景可以考虑ONEWAY方式

sendDefaultImpl的方法的参数分别的含义如下:
第一个参数 msg Message消息实例
第二个参数 CommunicationMode.SYNC 传输的是投递方式,这里表示默认使用SYNC的方式投递数据
第三个参数 null 该参数传递回调方法,只有当第二个参数的类型是ASYNC时,才会需要传递
第四个参数 timeout 该参数传递函数超时时间 image.png

接下来会校验数据的合法性 image.png

尝试获取TopicPublishInfo类
该类存储了Topic相关的信息,比如MessageQueue相关信息、决定了消息发往哪个队列的sendWhichQueue、TopicRouteData中存储了Queue和Broker的相关信息 image.png

接下来会根据消息投递的方式判断当前投递失败时,需要重新投递的次数
this.defaultMQProducer.getRetryTimesWhenSendFailed()是重新投递的次数,默认值是2 image.png

选择MessageQueue
然后进行消息的投递
image.png

如果数据长度大于compressMsgBodyOverHowmuch会执行压缩,它的默认值是4K image.png

根据投递方式参数,进行投递 image.png