以DefaultMQProducer.send(Message msg)方法为例,讲解Producer消息的发送逻辑,该方法最终调用DefaultMQProducerImpl.sendDefaultImpl(Message msg, CommunicationMode communicationMode, SendCallback sendCallback, long timeout)方法完成消息的发送处理,其中请求参数的默认值:communicationMode= CommunicationMode.SYNC(同步发送方式),sendCallback=null,timeout=3000。大致逻辑如下:
1、检查DefaultMQProducerImpl的ServiceState是否为RUNNING,若不是RUNNING状态则直接抛出MQClientException异常给调用者;
2、校验Message消息对象的各个字段的合法性,其中Message对象的body的长度不能大于128KB;
3、以Message消息中的topic为参数调用DefaultMQProducerImpl. tryToFindTopicPublishInfo (String topic)方法从topicPublishInfoTable: ConcurrentHashMap<String/* topic */, TopicPublishInfo>变量中获取TopicPublishInfo对象;
3.1)若没有对应的TopicPublishInfo对象,则创建一个新的TopicPublishInfo对象,并存入topicPublishInfoTable变量中(在该变量中有该topic的记录,表示该Producer在向NameServer获取到topic信息之后会为该topic创建本地消息队列Messa