一、背景描述
Springboot 集成 MQTT ,在服务端启动后,控制台一直在报 MQTT 已断开连接,在重试中ing。问题就是MQTT客户端频繁掉线、上线。
报错内容如下:
MQTT Rec: xxxxx org.springframework.integration.mqtt.inbound.MqttPahoMessageDrivenChannelAdapter Lost connection: 已断开连接; retrying…
二、原因分析
原因一:clientID相同,即clientId重复导致
由于我和同事并行开发,使用的同一套代码,所以我们两个连接MQTT的clientId导致重复。
原因二:当前用户没有Topic权限
原因三:在回调函数内进行业务处理遇到异常并没有捕获
三、解决方案
3.1 方案一
针对原因一的解决方案是在全局使用的clientID保证唯一性,可以采用UUID/时间戳等方式。
实现方式有很多种,以下代码只是其中一种,可参考:
修改过后我们可以从EMQ Dashboard 页面查看clientId,如下所示:
3.2 方案二
针对原因二的解决方案是如果配置有acl权限,则查询当前登录mqtt用户是否具有订阅对应topic的权限,无权时也会造成一直频繁断线重连,如果没有权限时需要添加上对应的权限。
3.3 方案三
针对原因三的解决方案是在可能出现异常的语句块,进行try-catch捕获。
本文完结!