一、业务场景
我们在使用MQTT协议的时候,有些伙伴可能会遇到MQTT客户端频繁掉线、上线问题
二、原因分析及异常处理
-
原因:使用相同的clientID
方案:全局使用的clientID保证唯一性,可以采用UUID等方式 - 原因: 当前用户没有Topic权限
方案:如果配置有acl权限,则查询当前登录mqtt用户是否具有订阅对应topic的权限,无权时也会造成一直频繁断线重连
3. 原因:在回调函数内进行业务处理遇到异常并没有捕获
方案:在可能出现异常的语句块,进行try-catch捕获
/**
* subscribe订阅后得到的消息会执行到这里
*/
@Override
public void messageArrived(String topic, MqttMessage message) {
String msg = new String(message.getPayload());
try {
//此处可能因为收到的消息不合法,会造成JSON转化异常,若异常未捕获,会导致MQTT客户端掉线
JSONObject jsonObject = JSON.parseObject(msg);
String gwId = String.valueOf(jsonObject.get("gwId"));
} catch (JSONException e) {
log.error("JSON Format Parsing Exception : {}", msg);
}
}