一、背景
为什么要本地运行源码呢?前一段时间遇到一个问题,每次系统自动呼叫三方运力(美团、蜂鸟、达达之类)的时候,总是会重复呼叫两次;最后排查发现是RocketMQ Consumer消费超时,进而导致重复消费,昨天在复习RocketMQ的时候,很神奇的就深入到消费的核心逻辑里了…(这里的故事下篇文章见)。理完Broker和Consumer的源码后也得出了一些结论,但需要加点日志跑一跑源码,让结论不是盖棺而论;所以就有了今天的故事。
二、下载源码
源码地址:https://github.com/Saint9768/rocketmq/releases/tag/rocketmq-all-4.8.0;PS:带有注释的RocketMQ-4.8.0版本的源码。
官网源码在这:https://github.com/apache/rocketmq/archive/refs/tags/rocketmq-all-4.8.0.zip
源码导入到Idea中的整体目录结构,张这个样:
文件路径为:/Users/zhouxin/ideaWorkplace/rocketmq
。
三、添加日志并启动
1、添加日志
1)在哪里加日志?
我们知道NameServer的启动类是NamesrvStartup
和Broker的启动类是BrokerStartup
,分别看一下他们的main()方法:
(1)在NamesrvStartup#main()方法套娃的createNamesrvController()
方法中可以看到有一个引入/conf/logback_namesrv.xml
文件的操作:
(2)BrokerStartup#main()方法也一样:
上两图中有指定日志文件的地址
,这里大家根据自己的源码项目所在项目位置自定义。
2)logback日志配置文件出处
先去官网下载个RocketMQ可执行程序:https://rocketmq.apache.org/dowloading/releases/。
解压rocketmq-all-4.8.0-bin-release.zip文件,然后进入到./rocketmq-all-4.8.0-bin-release/conf
目录下,可以看到logback_broker.xml
、logback_namesrv.xml
两个文件:
把它俩copy到我们源码的根目录下的conf文件夹中,即/Users/zhouxin/ideaWorkplace/rocketmq/conf
目录下;
3)日志输出位置
logback_broker.xml
中配置Broker日志文件的默认位置为:${user.home}/logs/rocketmqlogs/broker_default.log
:
在我本机user.home为/Users/zhouxin
,所以日志文件的位置为:/Users/zhouxin/logs/rocketmqlogs/broker_default.log
。
同样的NameServer的日志文件位置为:${user.home}/logs/rocketmqlogs/namesrv_default_default.log
;
2、启动
先运行NameServer再运行Broker即可。
1)先启动namesrv
NameServer启动类:org.apache.rocketmq.namesrv.NamesrvStartup
,进入直接运行main()方法即可;
运行的时候发现直接就停了,控制台输出如下:
全局搜一下ROCKETMQ_HOME
这个字符串,找到在NamesrvStartup中的位置:
原来我们设置RocketmqHome的位置不对,我们把它往上挪一挪;
再次启动,运行正常:
或者我们可以选择直接在Environment variables中配置ROCKETMQ_HOME:
也是一样的效果:
2)再启动Broker
启动之前我们先把代码中RocketmqHome的配置往上挪一挪(因为和上面我们启动NameServer的时候存在同样的ROCKETMQ_HOME不存在的问题
):
接着配置Broker的启动信息:
broker的启动类为org.apache.rocketmq.broker.BrokerStartup
,添加程序运行参数-n 127.0.0.1:9876 autoCreateTopicEnable=true
,然后运行即可。
最后运行main()方法,结果如下:
3、发送消息验证
OK,可以发送成功。