2022-06-16
今天写MQTT协议的时候想只创建一个客户端,同时用来做消息发布和消息订阅,然后发现消息发布之后不久就断开连接了,还不知道具体问题产生原因,先将过程记录下,后续如有想到再来补充
一、记录已知条件
- 同一 mqttClient 先订阅一个主题消息再向另一个主题发送消息(两个主题不一样)
- 创建 mqttClient 的 clientId 是固定的和随机的都会产生错误
- 发布消息和订阅消息都有成功,未发现其他报错
二、测试过程
- 注释发布消息,只订阅消息,未产生错误,程序运行正常
- 注释消息订阅,只发布消息,未产生错误,程序运行正常
三、临时解决方案(后续有时间再慢慢研究)
- 将消息订阅和消息发布分开创建两个客户端
2022-07-23 补充发现现象:
4. 发现程序执行到 client.publish() 方法时,不会往下执行
5. 一段时间后提示客户端为连接(应该卡到超时,断开了连接)
2022-07-30 终于破案了:
直接原因:在消息订阅的 messageArrived 回调方法中进行消息推送,导致线程卡死
根本原因:在同一个线程进行消息订阅和消息推送,导致MQTT程序内部造成死循环
解决方案:将消息推送异步执行 或者 在消息订阅后创建一个新的线程执行后续逻辑