本文中,我选择的 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... 打开如下对话框:
    在IDEA上简单搭建RocketMQ源码阅读环境_消息队列

  2. Open As Project:
    在IDEA上简单搭建RocketMQ源码阅读环境_xml_02

3.运行NameServer

namesrv 模块找到类 org.apache.rocketmq.namesrv.NamesrvStartup ,并运行它的 main 函数:

在IDEA上简单搭建RocketMQ源码阅读环境_apache_03

3.1 缺少环境变量ROCKETMQ_HOME

运行程序时出现以下报错:

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

Run -> Edit Configurations... 打开以下界面:

在IDEA上简单搭建RocketMQ源码阅读环境_xml_04

你可以把这个值设置成你当前项目目录的路径(例如,我的项目路径是 ROCKETMQ_HOME=F:\gitcode\gitee\rocketmq):

在IDEA上简单搭建RocketMQ源码阅读环境_apache_05

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  

在IDEA上简单搭建RocketMQ源码阅读环境_java_06

3.3 NameServer启动成功

控制台打印出以下文本,则表示 NameServer 启动成功了:

The Name Server boot success. serializeType=JSON
4.运行Broker

broker 模块找到类 org.apache.rocketmq.broker.BrokerStartup ,并运行它的 main 函数:

在IDEA上简单搭建RocketMQ源码阅读环境_消息队列_07

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上简单搭建RocketMQ源码阅读环境_xml_08

在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

在IDEA上简单搭建RocketMQ源码阅读环境_xml_09

修改 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  

在IDEA上简单搭建RocketMQ源码阅读环境_消息队列_10

broker.conf 下面追加以下两个属性:

namesrvAddr=localhost:9876
autoCreateTopicEnable=true

autoCreateTopicEnable 默认值就是 true,但是如果是正式的生产环境,会设置为false

接着,还要在 Run -> Edit Configurations... 修改程序启动参数:

  • 启动参数 -c 项目目录\conf\broker.conf 表示指定配置文件路径:
    在IDEA上简单搭建RocketMQ源码阅读环境_消息队列_11

  • 启动成功后,控制台的打印又多了 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

在IDEA上简单搭建RocketMQ源码阅读环境_xml_09

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