RocketMQ 5.1.0 提供者端 源码分析 函部分jvm源码

broker启动

由此进入broker中。

基础服务启动

基础服务启动流程

netty启动

netty执行链启动

NettyServerHandler 实现

请求命令处理类

处理器注册

处理函数在createBrokerController创建时进行初始化。也即在此处调用前就已经将所有处理器注册到processorTable中。


命令处理器

消息处理

此处使用SendMessageProcessor作为案例实现。
处理上下文构建

构建内部消息对象

消息处理

异步处理

在异步中将同步函数包装成future来完成的。但是此处紧接是将结果进行了包装,根据执行来看依然会执行同步的putMessage函数,然后他的结果返回后触发后面的future中then的调用。需要注意的是此处的asyncPutMessage在子类中重载了,故而不会触发此处。


函数调用

信息同步:同步和异步的putmessage都会进入到此处。接下来以asyncPutMessage开始讲述。


进入commitlog类

获取映射文件

image.png

获取最后一个文件,需要注意的是不一定获取到。


image.png

image.png

needcreate 此处传入的是true。
计算偏移

创建文件

将创建的文件添加到列表中

至此:一定是获取到了消息文件。


添加消息

上图中onCommitLogAppend函数为空所以忽略即可。
image.png

image.png

appendMessageBuffer()函数中获取的是mappedByteBuffer对象,便于前文的 MappedFile所对应。
image.png

至此文件写入便结束了。但是目前来说写入的数据依然在内存中,什么时候刷盘呢?需要再次返回到asyncPutMessage处,继续执行,如下图。
image.png

image.png

image.png

image.png

同步和异步区别不大,都是唤醒线程工作,只不过实现不同。
image.png

只要唤醒就刷,需要注意的是mappedFileQueue.flush(0)传入参数是0


image.png

而此处则传入了配置中的个数。
image.png

image.png

image.png

image.png

最终执行此处,进入到操作系统进行MSYNC。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。