前言
因业务需求需要在rocketmq中整合mqtt,期间遇到了许多问题,在此处记录
一、安装rocketmq和rocket-mqtt并能正常测试
具体参考rocketmq使用mqtt协议_rocketmq mqtt-优快云博客
如果按照该博客流程走,是可以正常生产和订阅的,其中补充遇到的几点坑
1. mqtt并不会自动创建索引,所以autoCreateTopicEnable属性不会生效,需要手动创建,会报如图所示的错误
2. 如果遇到了只能生产不能消费,有以下几种可能
2.1 未创建通配符列表(topic命名为mqtttest,rocketmq地址为192.168.5.251:9876为例)
配置通配符列表
sh mqadmin updateKvConfig -s LMQ -k mqtttest -v mqtttest/+ -n 192.168.5.251:9876
2.2 如果还是不能生效且是rocetmq生产,mqtt消费情景,有可能是子topic未设置(以子topic命名为task为例,用rocketmq消费断点可以看见,两种方式生产的数据差异在于properties中属性的不同,特别是mqtt生产中多出的INNER_MULTI_DISPATCH属性)
具体两者差异如下
#mqtt生产者
properties={CONSUME_START_TIME=1706501170642, MSG_REGION=DefaultRegion, UNIQ_KEY=C0A80510BC640EED1F1492CA922D0BBA, CLUSTER=DefaultCluster, INNER_MULTI_QUEUE_OFFSET=560,383, MIN_OFFSET=0, qosLevel=1, TAGS=MQTT_COMMON, TRACE_ON=true, originMqttTopic=mqtttest/task, INNER_MULTI_DISPATCH=%LMQ%mqtttest%+%,%LMQ%mqtttest%task%, IS_EMPTY_MSG=false, retryTimes=0, extData={"qosLevel":"1"}, MAX_OFFSET=191}
#rocketmq生产者
properties={CONSUME_START_TIME=1706509718866, MSG_REGION=DefaultRegion, UNIQ_KEY=C0A80C9A833873D16E93934D554F0009, CLUSTER=DefaultCluster, MIN_OFFSET=0, TAGS=task, WAIT=true, TRACE_ON=true, MAX_OFFSET=235}
具体代码参考rocketmq-mqtt源码中的RocketMQProducer
生产者关键代码:
static void sendMsg(DefaultMQProducer producer, String topic, String tag) throws Exception {
byte[] bytes = ("Hello RocketMQ " + topic + "/" + tag + DateUtil.formatDateTime(new Date())).getBytes(RemotingHelper.DEFAULT_CHARSET);
// 创建消息,并指定Topic,Tag和消息体
Message msg = new Message("mqtttest","MQTT_COMMON",bytes);
String secondTopic = "/task";
setLmq(msg, new HashSet<>(Arrays.asList(TopicUtils.wrapLmq(topic, secondTopic))));
// 发送异步消息
producer.send(msg,new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("发送结果:" + s