现象
在使用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版本开始,客户端和服务端不能跨版本使用;
解决办法
方法一
客户端使用和服务端同样的版本;
方法二
如何客户端和服务端版本不匹配,可以在Broker上手动创建这个默认Topic;