RocketMQ一个不兼容BUG: No route info for this topic

现象

在使用RocketMQ的DefaultMQProducer发送消息时,如果此消息的Topic之前不存在,则会报错:

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:1055)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1021)
at org.apache.rocketmq.client.impl.producer.DefaultMQProducerImpl.send(DefaultMQProducerImpl.java:1016)
at org.apache.rocketmq.client.producer.DefaultMQProducer.send(DefaultMQProducer.java:389)
at me.litian.test.mq.rocketmq.order.OrderedProducer.main(OrderedProducer.java:27)

分析

RocketMQ其实是支持自动创建Topic的,而且Broker默认打开了这个开关,之所以发生这个问题,是因为代码自身的BUG。

原因
在DefaultMQProducer对象中有一个属性createTopicKey,用于设置消息的默认Topic,其取值为MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC;
这个属性的取值需要和Broker配合,就是Broker在初始化时,会自动创建这个Topic;
但是,在RocketMQ4.3.1版本中,这个属性的取值发生了变化:

4.3.0 4.3.1
AUTO_CREATE_TOPIC_KEY TBW102

所以,导致从4.3.1版本开始,客户端和服务端不能跨版本使用;

解决办法

  1. 方法一
    客户端使用和服务端同样的版本:4.3.0
  2. 方法二
    如何客户端和服务端版本不匹配,可以在Broker上手动创建这个默认Topic;
    sh mqadmin updateTopic –n 192.168.1.23:9876 –c DefaultCluster –t new-topic-name
    

原文:https://www.jianshu.com/p/c85237034e50

你可能感兴趣的:(中间件)