我是用java sdk创建client连接EMQX broker的时候:
出现了回调方法频繁被触发:
解决方式:KeepAliveInterval心跳值的优化
new MqttCallback() {
@Override
public void connectionLost(Throwable throwable) {
log.info("connectionLost:", throwable);//频繁被触发出现下面的错误
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
log.info("sub:{},data:{}", s, new String(mqttMessage.getPayload()));
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
}
}
错误信息:
org.eclipse.paho.client.mqttv3.MqttException: Connection lost
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:190)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.EOFException: null
at java.io.DataInputStream.readByte(DataInputStream.java:267)
at org.eclipse.paho.client.mqttv3.internal.wire.MqttInputStream.readMqttWireMessage(MqttInputStream.java:92)
at org.eclipse.paho.client.mqttv3.internal.CommsReceiver.run(CommsReceiver.java:137)
… 1 common frames omitted
解决方式:
首先思考连接断开的原因是什么?无非就是鉴权,心跳;
这里观察回掉被触发的周期 50s;(这个应该是在broker上可以配置的)
再观察我们client设置的心跳周期
// 设置会话心跳时间 单位为秒
//options.setKeepAliveInterval(60);//旧的 赶不上趟的心跳发送
options.setKeepAliveInterval(40);//修改后