在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源碼閱讀環境搭建成功,且驗證成功!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM