2022-06-16
今天写MQTT协议的时候想只创建一个客户端,同时用来做消息发布和消息订阅,然后发现消息发布之后不久就断开连接了,还不知道具体问题产生原因,先将过程记录下,后续如有想到再来补充
一、记录已知条件
- 同一 mqttClient 先订阅一个主题消息再向另一个主题发送消息(两个主题不一样)
- 创建 mqttClient 的 clientId 是固定的和随机的都会产生错误
- 发布消息和订阅消息都有成功,未发现其他报错
二、测试过程
- 注释发布消息,只订阅消息,未产生错误,程序运行正常
- 注释消息订阅,只发布消息,未产生错误,程序运行正常
三、临时解决方案(后续有时间再慢慢研究)
- 将消息订阅和消息发布分开创建两个客户端
2022-07-23 补充发现现象:
4. 发现程序执行到 client.publish() 方法时,不会往下执行

5. 一段时间后提示客户端为连接(应该卡到超时,断开了连接)

2022-07-30 终于破案了:
直接原因:在消息订阅的 messageArrived 回调方法中进行消息推送,导致线程卡死
根本原因:在同一个线程进行消息订阅和消息推送,导致MQTT程序内部造成死循环
解决方案:将消息推送异步执行 或者 在消息订阅后创建一个新的线程执行后续逻辑
2024-10-18 补充
MQTT 掉线问题总结:断线的原因基本上都是 messageArrived 回调方法 里面的业务逻辑导致的
- 业务逻辑报错
- 业务逻辑运行时间过长(10s以上)
博客作者在实现MQTT协议时遇到一个问题,即使用同一个客户端进行消息发布和订阅导致连接频繁断开。经过排查,发现问题在于消息订阅的messageArrived回调中执行消息推送,造成线程死锁。解决办法是将消息推送异步执行或在订阅后创建新线程处理后续逻辑,避免线程内部循环。
2万+





