工具
MQTT客户端是用的 paho http://www.eclipse.org/paho/java
问题
采用如下配置服务器
connOpts = new MqttConnectOptions(); connOpts.setCleanSession(true); connOpts.setConnectionTimeout(10); connOpts.setKeepAliveInterval(90); connOpts.setAutomaticReconnect(true);
当网络断开后,客户端会进行重连,可是重连以前订阅的主题就失效了,再也不接受以前订阅主题的消息。网络
解决方法
由于配置里将cleanSession 设为 true ,当客户端掉线时 ,服务器端会清除 客户端 session 。 重连后 客户端会有一个新的session。session
第一种
把配置里的 cleanSession 设为false,客户端掉线后 服务器端不会清除session,当重连后能够接收以前订阅主题的消息。当客户端上线后会接受到它离线的这段时间的消息eclipse
第二种
经过查看 connect 方法的代码发现工具
若是咱们设置的 callback实现了 MqttCallbackExtended接口,就会把它设置给connectActionListener,我再来看看MqttCallbackExtended接口。
url
能够看到这个接口拓展了一个方法,该方法会在链接到服务器成功时调用,正符合咱们的要求。我只须要实现这个接口并在这个方法里重新订阅以前的主题就好了。spa
这种方法重连以后不会收到离线期间该主题的消息.net