一、背景

为什么要本地运行源码呢?前一段时间遇到一个问题,每次系统自动呼叫三方运力(美团、蜂鸟、达达之类)的时候,总是会重复呼叫两次;最后排查发现是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中的整体目录结构,张这个样:

RocketMQ源码如何在本地运行_java


文件路径为:​​/Users/zhouxin/ideaWorkplace/rocketmq​​。

三、添加日志并启动

1、添加日志

1)在哪里加日志?

我们知道NameServer的启动类是​​NamesrvStartup​​​和Broker的启动类是​​BrokerStartup​​,分别看一下他们的main()方法:

(1)在NamesrvStartup#main()方法套娃的​​createNamesrvController()​​​方法中可以看到有一个引入​​/conf/logback_namesrv.xml​​文件的操作:

RocketMQ源码如何在本地运行_java_02


(2)BrokerStartup#main()方法也一样:

RocketMQ源码如何在本地运行_RocketMQ_03


上两图中有​​指定日志文件的地址​​,这里大家根据自己的源码项目所在项目位置自定义。

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​​两个文件:

RocketMQ源码如何在本地运行_apache_04


把它俩copy到我们源码的根目录下的conf文件夹中,即​​/Users/zhouxin/ideaWorkplace/rocketmq/conf​​目录下;

3)日志输出位置

​logback_broker.xml​​​中配置Broker日志文件的默认位置为:​​${user.home}/logs/rocketmqlogs/broker_default.log​​:

RocketMQ源码如何在本地运行_后端_05

在我本机user.home为​​/Users/zhouxin​​​,所以日志文件的位置为:​​/Users/zhouxin/logs/rocketmqlogs/broker_default.log​​。

同样的NameServer的日志文件位置为:​​${user.home}/logs/rocketmqlogs/namesrv_default_default.log​​;

RocketMQ源码如何在本地运行_RocketMQ_06

2、启动

先运行NameServer再运行Broker即可。

1)先启动namesrv

NameServer启动类:​​org.apache.rocketmq.namesrv.NamesrvStartup​​​,进入直接运行main()方法即可;
运行的时候发现直接就停了,控制台输出如下:

Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ

RocketMQ源码如何在本地运行_日志文件_07


全局搜一下​​ROCKETMQ_HOME​​这个字符串,找到在NamesrvStartup中的位置:

RocketMQ源码如何在本地运行_RocketMQ_08


原来我们设置RocketmqHome的位置不对,我们把它往上挪一挪;

RocketMQ源码如何在本地运行_RocketMQ_09


再次启动,运行正常:

RocketMQ源码如何在本地运行_后端_10

或者我们可以选择直接在Environment variables中配置ROCKETMQ_HOME:

RocketMQ源码如何在本地运行_后端_11


也是一样的效果:

RocketMQ源码如何在本地运行_java_12

2)再启动Broker

启动之前我们先把代码中RocketmqHome的配置往上挪一挪(因为和上面我们启动NameServer的时候存在同样的​​ROCKETMQ_HOME不存在的问题​​):

RocketMQ源码如何在本地运行_java_13

接着配置Broker的启动信息:
broker的启动类为​​​org.apache.rocketmq.broker.BrokerStartup​​​,添加程序运行参数​​-n 127.0.0.1:9876 autoCreateTopicEnable=true​​,然后运行即可。

-n 127.0.0.1:9876 autoCreateTopicEnable=true

RocketMQ源码如何在本地运行_apache_14


最后运行main()方法,结果如下:

RocketMQ源码如何在本地运行_日志文件_15

3、发送消息验证

OK,可以发送成功。

RocketMQ源码如何在本地运行_后端_16