天天看點

解決org.apache.rocketmq報No route info of this topic:異常解決org.apache.rocketmq報No route info of this topic:異常

解決org.apache.rocketmq報No route info of this topic:異常

在使用rocket過程中遇到問題,使用com.alibaba.rocketmq的依賴包不會報錯,而使用Apache(copy 官網 example)的報如下錯誤:

Exception in thread "main" org.apache.rocketmq.client.exception.MQClientException: No route info for this topic, TopicTest
For more information, please visit the url, http://rocketmq.apache.org/docs/faq/
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.sendSelectImpl(DefaultMQProducerImpl.java:1031)
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:997)
	at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:992)
	at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:389)
           

通過查資料,找到的解決方式

方法一:
啟動mqbroker的時候需要指定autoCreateTopicEnable=true,允許自動建立Topic,
nohup sh mqbroker -n x.x.x.x:9876 autoCreateTopicEnable=true
           
方法二:
通過方式一,仍不能解決,可以采用手動建立方式,
 sh mqadmin updateTopic -n x.x.x.x:9876 -c DefaultCluster -t Topictest -w 4 -r 4
           
調試源碼

通過方式二可以解決,但是每次建立topic,都采用手動方式是不是有點low,是以隻能看二者的源碼來解決,通過對比二者的源碼發現不同之處,

rocket使用一個不存在的topic時,Alibaba和Apache都采用預設topickey标記方式去建立,發現不同之處是Apache調用
org.apache.rocketmq.client.impl.factory.MQClientInstance#updateTopicRouteInfoFromNameServer(java.lang.String, boolean, org.apache.rocketmq.client.producer.DefaultMQProducer)中的
org.apache.rocketmq.client.impl.MQClientAPIImpl#getDefaultTopicRouteInfoFromNameServer出現異常,導緻直接退出,
           

是以就定位出問題所在,通過debug,發現二者給服務端發請求中包含的版本不同,

請求中包含版本資訊
Alibaba RemotingCommand 
[code=105, language=JAVA, version=78, opaque=158, flag(B)=0, remark=null, extFields=null]
Apache RemotingCommand 
[code=105, language=JAVA, version=273, opaque=650, flag(B)=0, remark=null, extFields=null, serializeTypeCurrentRPC=JSON]

在org.apache.rocketmq.common.MQVersion中發現,服務端對應的版本是4.3.1,而官網引用的例子中是4.3.0
           
總結

根本原因是本人在使用官方demo時,沒有注意其client和server版本對應問題,直接使用最新的版本,才出現如此低級錯誤,用此文來告誡自己。

特别感謝

​ 特别感謝我老大,在我發現二者差別時,仍不能找出原因,老大幫我debug,然後發現版本異常,然後通過調試服務端源碼,才排除版本問題,非常感謝。

繼續閱讀