Mqtt Paho(Java)的重連及使用
此篇呢就說淺淺的說下Mqtt Paho的重連及使用.
還是一樣,咋們先看下配置項
MqttConnectionOption里的配置里有setAutomaticReconnect這個選項
它需要放入一個布爾值(Boolean)來控制開關
1.True 設定為true時,mqtt的重連機制會啟動,當mqtt client掉線之后它會進入重連.
2.False 設定為false時當然是不打開.
是否打開以上選項其實我們都需要做一個東西,就是實現mqtt的回調類MqttCallbackExtended或者MqttCallback.
這里先講一下回調類
MqttCallbackExtended是繼承了MqttCallback.他們有什么不同呢.
MqttCallback接口里面只有個3方法
public interface MqttCallback { void connectionLost(Throwable var1); void messageArrived(String var1, MqttMessage var2) throws Exception; void deliveryComplete(IMqttDeliveryToken var1); }
connectionLost是在連接已經連上且丟失后走這里
messageArrived這個是消息發送到接收端時觸發
deliveryComplete這個是發送完成
MqttCallbackExtended
public interface MqttCallbackExtended extends MqttCallback { void connectComplete(boolean var1, String var2); }
它的話是多出了一個方法connectComplete
它是在丟失重連成功后會觸發該方法
看完以上的功能,我相信小伙伴們就知道為什么需要實現回調類了,然后咋們繼續來看下他們的使用。
以下是在setAutomaticReconnect為True的時候使用的.為什么這樣說呢,因為如果不為true的情況下,它並不會觸發connectComplete(原因以后的篇章會講),上代碼
MqttClient client = new MqttClient; ...... client.setCallback(new MqttCallbackExtended() { @Override public void connectComplete(boolean b, String s) { System.out.println("丟失重連成功"); } @Override public void connectionLost(Throwable throwable) { log.error("connect lost"); int i = 3; while (true) { if (i < 0) { //這里是我自己為了失敗3次后告警使用 WarmingUtil.getwarming("2", "mqtt丟失問題"); break; } if (!client.isConnected()) { System.out.println("***** client to connect *****"); try { //這個是30秒后重連 Thread.sleep(30000); client.reconnect(); } catch (Exception e) { e.printStackTrace(); continue; } i--; } if (client.isConnected()) { System.out.println("***** connect success *****"); break; } } } @Override public void messageArrived(String s, MqttMessage mqttMessage) throws Exception { } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { } }); ......
如果為false就new 一個MqttCallback方法,然后再實現它的子類,然后實現自己想要的重連方式就好了.
但是有個地方要注意的就是這里不是使用reconnect()方法了,而是使用connect()方法來重連.
以上就可以實現mqtt掉線重連了.
還有一個需要注意的就是,如果你在消息發送到達接收端的時候,即接收端返回信息,觸發messageArrived方法的時候不建議在方法里調用其他方法或者操作其他事情,因為這樣會導致mqtt掉線的問題,這個博主也是屢試不爽哈哈,最后找到原因,詳見鏈接(未寫)