本文中,我选择的 RocketMQ 的版本号是 4.8.0
方式一:下载zip包,然后解压到当前文件夹
方式二:在Git Bash界面克隆指定分支代码
git clone -b rocketmq-all-4.8.0 https://gitee.com/apache/rocketmq.git
git clone -b rocketmq-all-4.8.0 https://github.com/apache/rocketmq.git
File -> Open... 打开如下对话框:
Open As Project:
在 namesrv 模块找到类 org.apache.rocketmq.namesrv.NamesrvStartup
,并运行它的 main 函数:
运行程序时出现以下报错:
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 安装的根目录。
再次运行 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
控制台打印出以下文本,则表示 NameServer 启动成功了:
The Name Server boot success. serializeType=JSON
在 broker 模块找到类 org.apache.rocketmq.broker.BrokerStartup
,并运行它的 main 函数:
运行程序时出现以下报错:
Please set the ROCKETMQ_HOME variable in your environment to match the location of the RocketMQ installation
还是设置环境变量 ROCKETMQ_HOME,方法同本文 3.1 中的方法,不多赘述。
在IDEA中为每个程序设置环境变量时,它们的环境变量是相互独立的,因此我们需要设置多次。
再次运行 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
控制台打印如下信息,表示 Broker 启动成功:
The broker[你的主机名, 你的主机IPv4地址:10911] boot success. serializeType=JSON
在 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 函数...
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)
这个错误的原因通常有:
第三点排除,因为我们已经在代码中明确指定了 Name Server 的地址。
参考自 《RocketMQ 解决 No route info of this topic 异常步骤》
我们把路径为 项目目录\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
此次没有异常了,控制台打印了 1000 条 SendResult 的 toString 信息。
在 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源码阅读环境搭建成功,且验证成功!