send代码解析
我们进入send函数一看究竟
给topic追加上命名空间,然后调用默认的生产者实现类中的send方法
RocketMQ源码大量使用重载,本次重载追加上了默认的投递超时时间
这里调用真正的默认消息投递方法,这里插播讲一下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 该参数传递函数超时时间
接下来会校验数据的合法性
尝试获取TopicPublishInfo类
该类存储了Topic相关的信息,比如MessageQueue相关信息、决定了消息发往哪个队列的sendWhichQueue、TopicRouteData中存储了Queue和Broker的相关信息
接下来会根据消息投递的方式判断当前投递失败时,需要重新投递的次数
this.defaultMQProducer.getRetryTimesWhenSendFailed()是重新投递的次数,默认值是2
选择MessageQueue
然后进行消息的投递
如果数据长度大于compressMsgBodyOverHowmuch会执行压缩,它的默认值是4K
根据投递方式参数,进行投递