在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打开项目

  1. File -> Open... 打开如下对话框:

  2. 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)

这个错误的原因通常有:

  1. Broker禁止自动创建Topic,且用户没有通过手工方式创建Topic
  2. Broker没有正确连接到Name Server
  3. Producer没有正确连接到Name Server

第三点排除,因为我们已经在代码中明确指定了 Name Server 的地址。

参考自 《RocketMQ 解决 No route info of this topic 异常步骤》

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源码阅读环境搭建成功,且验证成功!

posted @ 2021-09-05 15:51  极客子羽  阅读(1170)  评论(1编辑  收藏  举报