mqtt-client回調方法簡介
毫無疑問Callback方式是最復雜的一種,但是其也是能夠提供更好的服務,因此有必要好好研究,下面就是對使用回調方式的簡單介紹:
一、在使用回調方式前,先通過MQTT獲取回調連接:
MQTT mqtt=new MQTT(); //此處省略設置MQTT的屬性 CallbackConnection connection=mqtt.callbackConnection();
二、調用CallbackConnection的方法實現業務邏輯:
1、connect(連接方法):
connection.connect(new Callback<Void>() { public void onSuccess(Void arg0) { //進入該方法表示連接成功連接成功 } public void onFailure(Throwable value) { //進入該方法表示連接失敗 } });
一般可以在connect的onSuccess方法中發布或者訂閱相應的主題,在其onFailure方法中作相應的斷開連接等操作
2、listener(監聽方法):
connection.listener(new Listener() { @Override public void onPublish(UTF8Buffer topicmsg, Buffer msg, Runnable ack) { //utf-8 is used for dealing with the garbled //String topic = topicmsg.utf8().toString(); //String payload = msg.utf8().toString(); //表示監聽成功 ack.run(); } @Override public void onFailure(Throwable value) { //表示監聽失敗 } //execute only once when connection is ended @Override public void onDisconnected() { /表示監聽到斷開連接 } //execute only once when connecting started @Override public void onConnected() { //表示監聽到連接成功 } });
onPublish表示成功,可以獲取到訂閱的主題和訂閱的內容(UTF8Buffer topicmsg表示訂閱的主題, Buffer msg表示訂閱的類容),一般的可以在這個方法中獲取到訂閱的主題和內容然后進行相應的判斷和其他業務邏輯操作;
onFailure表示監聽失敗,這里可以調用相應的斷開連接等方法;
onConnected表示監聽到連接建立,該方法只在建立連接成功時執行一次,表示連接成功建立,如果有必要可以在該方法中進行相應的訂閱操作;
onDisconnected表示監聽到連接斷開,該方法只在斷開連接時執行一次,如有必要可以進行相應的資源回收操作。
3、subscribe(訂閱方法):
connection.subscribe(topics, new Callback<byte[]>() { @Override public void onSuccess(byte[] qoses) { //主題訂閱成功 } @Override public void onFailure(Throwable value) { //狀態主題訂閱失敗 } });
onSuccess方法表示訂閱成功,onFailure方法表示訂閱失敗;方法中Topic[] topics表示定於的主題數組,注意只有在改方法訂閱的主題,才能夠在監聽方法中接收到。
4、publish(發布主題方法):
connection.publish(topic, payload.getBytes(), qos, retain, new Callback<Void>() { @Override public void onSuccess(Void arg0) { //表示發布主題成功 } @Override public void onFailure(Throwable throwable) { //表示發布主題失敗 } });
publish方法用於發布響應的主題,以便訂閱者訂閱;onSuccess表示發布成功,onFailure表示發布失敗。
5、disconnect(斷開連接方法):
connection.disconnect(new Callback<Void>() { @Override public void onSuccess(Void arg0) { //與服務器斷開連接成功 } @Override public void onFailure(Throwable arg0) { //與服務器斷開連接失敗 } });
disconnect表示斷開與代理服務器的連接,調用該方法后只是表示斷開連接但是實際的connect依然存在並沒有為null,再次調用connect方法又能夠連接成功。
注意:
1、在上面的五個方法中一般先調用connect和listener方法
2、回調將執行與連接相關聯的調度隊列,以便可以安全使用從回調的連接,但你絕不能在回調中執行任何阻塞操作,否則會改變執行的順序,這樣可能出錯。如果可能存在阻塞時,最好是在連接的調度隊列中執行另外一個線程:
connection.getDispatchQueue().execute(new Runnable() { public void run() { //在這里進行相應的訂閱、發布、停止連接等等操作 } });