Producer发送消息后,会由SendMessageProcessor类的processRequest方法进行处理,其中会调用sendMesaage方法
主要步骤
1.创建响应对象Response,用来返回给Producer消息的处理结果
2.设置消息相关信息:请求id,消息体,请求队列,topic等
3.将信息封装到MessageExtBrokerInner对象中
4.消息topic,properties等一些属性的判断
5.从MapedFileQueue中获取MapedFile(代表一个commitlog文件)
6.判断MapedFile对应的文件是否已经满了,满了就创建一个新的文件并返回MapedFile
7.计算物理offset=fileFromOffset + byteBuffer.position()
8.创建消息id,获取queueOffset,propertiesData,topicData等消息需要保存的信息
9.判断消息的长度是否溢出
10.判断MapedFile对应的commitlog文件剩下的空间是否足够,若不够则将commitlog剩余的空间填充并返回END_OF_FILE状态,如果是该状态将会创建一个新的commitlog文件然后重复上面的操作
11.将消息的相关信息通过ByteBuffer写入内存并返回如下消息:
a)消息发送状态
b)物理offset
c)消息长度
d)消息id
e)消息创建时间
f)queueOffset
g)rt
12更新wrotePostion和storeTimestamp(