本文中,我選擇的 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源碼閱讀環境搭建成功,且驗證成功!