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

当使用RocketMQ的DefaultMQProducer发送新Topic消息时,若Topic不存在,会遇到错误。尽管RocketMQ支持自动创建Topic,但在4.3.1版本中,由于createTopicKey属性变化,导致客户端与服务端跨版本时无法正常工作。解决办法包括保持客户端和服务端版本一致或手动在Broker上创建默认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.04.3.1
AUTO_CREATE_TOPIC_KEYTBW102

所以,导致从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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值