天天看点

解决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,然后发现版本异常,然后通过调试服务端源码,才排除版本问题,非常感谢。

继续阅读