[MQTT] 创建一个客户端做消息订阅和消息推送,连接自动断开问题记录

博客作者在实现MQTT协议时遇到一个问题,即使用同一个客户端进行消息发布和订阅导致连接频繁断开。经过排查,发现问题在于消息订阅的messageArrived回调中执行消息推送,造成线程死锁。解决办法是将消息推送异步执行或在订阅后创建新线程处理后续逻辑,避免线程内部循环。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2022-06-16
今天写MQTT协议的时候想只创建一个客户端,同时用来做消息发布和消息订阅,然后发现消息发布之后不久就断开连接了,还不知道具体问题产生原因,先将过程记录下,后续如有想到再来补充

一、记录已知条件

  1. 同一 mqttClient 先订阅一个主题消息再向另一个主题发送消息(两个主题不一样)
  2. 创建 mqttClient 的 clientId 是固定的和随机的都会产生错误
  3. 发布消息和订阅消息都有成功,未发现其他报错

二、测试过程

  1. 注释发布消息,只订阅消息,未产生错误,程序运行正常
  2. 注释消息订阅,只发布消息,未产生错误,程序运行正常

三、临时解决方案(后续有时间再慢慢研究)

  1. 将消息订阅和消息发布分开创建两个客户端

2022-07-23 补充发现现象:
4. 发现程序执行到 client.publish() 方法时,不会往下执行
在这里插入图片描述
5. 一段时间后提示客户端为连接(应该卡到超时,断开了连接)
在这里插入图片描述

2022-07-30 终于破案了:
直接原因:在消息订阅的 messageArrived 回调方法中进行消息推送,导致线程卡死
根本原因:在同一个线程进行消息订阅和消息推送,导致MQTT程序内部造成死循环
解决方案:将消息推送异步执行 或者 在消息订阅后创建一个新的线程执行后续逻辑

2024-10-18 补充
MQTT 掉线问题总结:断线的原因基本上都是 messageArrived 回调方法 里面的业务逻辑导致的

  1. 业务逻辑报错
  2. 业务逻辑运行时间过长(10s以上)
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值