在IDEA上简单搭建RocketMQ源码阅读环境
本文中,我选择的 RocketMQ 的版本号是 4.8.0
1.下载源码
方式一:下载zip包,然后解压到当前文件夹
方式二:在Git Bash界面克隆指定分支代码
- 从码云(国内)上克隆分支 rocketmq-all-4.8.0
git clone -b rocketmq-all-4.8.0 https://gitee.com/apache/rocketmq.git
- 从Github(国外)上克隆分支 rocketmq-all-4.8.0
git clone -b rocketmq-all-4.8.0 https://github.com/apache/rocketmq.git
2. 用IDEA打开项目
-
File -> Open... 打开如下对话框:
-
Open As Project:
3.运行NameServer
在 namesrv 模块找到类 org.apache.rocketmq.namesrv.NamesrvStartup
,并运行它的 main 函数:
3.1 缺少环境变量ROCKETMQ_HOME
运行程序时出现以下报错:
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
Run -> Edit Configurations... 打开以下界面:
你可以把这个值设置成你当前项目目录的路径(例如,我的项目路径是 ROCKETMQ_HOME=F:\gitcode\gitee\rocketmq
):
ROCKETMQ_HOME 表示 RocketMQ 安装的根目录。
3.2 缺少配置文件logback_namesrv.xml
再次运行 NamesrvStartup 继续报错:
ch.qos.logback.core.joran.spi.JoranException: Could not open [F:\gitcode\gitee\rocketmq\conf\logback_namesrv.xml].
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:80)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:68)
at org.apache.rocketmq.namesrv.NamesrvStartup.createNamesrvController(NamesrvStartup.java:119)
at org.apache.rocketmq.namesrv.NamesrvStartup.main0(NamesrvStartup.java:57)
at org.apache.rocketmq.namesrv.NamesrvStartup.main(NamesrvStartup.java:51)
我们把路径为 项目目录\distribution\conf\logback_namesrv.xml 拷贝到 项目目录\conf\logback_namesrv.xml
3.3 NameServer启动成功
控制台打印出以下文本,则表示 NameServer 启动成功了:
The Name Server boot success. serializeType=JSON
4.运行Broker
在 broker 模块找到类 org.apache.rocketmq.broker.BrokerStartup
,并运行它的 main 函数:
4.1 缺少环境变量ROCKETMQ_HOME
运行程序时出现以下报错:
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
还是设置环境变量 ROCKETMQ_HOME,方法同本文 3.1 中的方法,不多赘述。
在IDEA中为每个程序设置环境变量时,它们的环境变量是相互独立的,因此我们需要设置多次。
4.2 缺少配置文件logback_broker.xml
再次运行 BrokerStartup 继续报错:
ch.qos.logback.core.joran.spi.JoranException: Could not open [F:\gitcode\gitee\rocketmq\conf\logback_broker.xml].
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:80)
at ch.qos.logback.core.joran.GenericConfigurator.doConfigure(GenericConfigurator.java:68)
at org.apache.rocketmq.broker.BrokerStartup.createBrokerController(BrokerStartup.java:190)
at org.apache.rocketmq.broker.BrokerStartup.main(BrokerStartup.java:58)
类似地,我们把路径为 项目目录\distribution\conf\logback_broker.xml 拷贝到 项目目录\conf\logback_broker.xml
4.3 Broker启动成功
控制台打印如下信息,表示 Broker 启动成功:
The broker[你的主机名, 你的主机IPv4地址:10911] boot success. serializeType=JSON
5.运行Producer
在 example 模块找到类 org.apache.rocketmq.example.quickstart.Producer
:
修改 Producer 的代码:
/*
* Specify name server addresses.
* <p/>
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
* <pre>
* {@code
* producer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
* </pre>
*/
producer.setNamesrvAddr("localhost:9876"); // 这行是新增的,namesrv 就启动在本地
运行它的 main 函数...
5.1 No route info of this topic
org.apache.rocketmq.client.exception.MQClientException: No route info of this topic: TopicTest
See http://rocketmq.apache.org/docs/faq/ for further details.
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendDefaultImpl(DefaultMQProducerImpl.java:685)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1343)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1289)
at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:325)
at org.apache.rocketmq.example.quickstart.Producer.main(Producer.java:67)
这个错误的原因通常有:
- Broker禁止自动创建Topic,且用户没有通过手工方式创建Topic
- Broker没有正确连接到Name Server
- Producer没有正确连接到Name Server
第三点排除,因为我们已经在代码中明确指定了 Name Server 的地址。
5.1.x 指定broker.conf 并重启 BrokerStartup
我们把路径为 项目目录\distribution\conf\broker.conf 拷贝到 项目目录\conf\broker.conf
在 broker.conf 下面追加以下两个属性:
namesrvAddr=localhost:9876
autoCreateTopicEnable=true
autoCreateTopicEnable 默认值就是 true,但是如果是正式的生产环境,会设置为false
接着,还要在 Run -> Edit Configurations... 修改程序启动参数:
-
启动参数
-c 项目目录\conf\broker.conf
表示指定配置文件路径:
-
启动成功后,控制台的打印又多了 Name Server 地址信息:
The broker[broker-a, 本机IPv4地址:10911] boot success. serializeType=JSON and name server is localhost:9876
5.2 再次运行 Producer
此次没有异常了,控制台打印了 1000 条 SendResult 的 toString 信息。
6.运行Consumer
在 example 模块找到类 org.apache.rocketmq.example.quickstart.Consumer
:
修改 Consumer 的代码:
/*
* Specify name server addresses.
* <p/>
*
* Alternatively, you may specify name server addresses via exporting environmental variable: NAMESRV_ADDR
* <pre>
* {@code
* consumer.setNamesrvAddr("name-server1-ip:9876;name-server2-ip:9876");
* }
* </pre>
*/
consumer.setNamesrvAddr("localhost:9876"); // 这行是新增的,namesrv 就启动在本地
运行它的 main 函数...控制台打印 Consumer Started.
。接着就是 1000 条 ConsumeMessageThread_数字 Receive New Messages: [MessageExt ...
信息。
至此,在IDEA上的RocketMQ源码阅读环境搭建成功,且验证成功!