簡體   English   中英

MQTT客戶端重新用於發布/訂閱

[英]MQTT client re-using for publish / subscribe

我有一個Web服務器,它獲取了大量相同主題的消息,並將響應消息返回給另一個主題。

我目前正在通過保持MQTT客戶端始終連接來重新使用相同的MQTT客戶端實例來進行回調和發送響應消息。

但是,在收到消息並發送響應的一個周期后,我能夠收到另一條消息但無法發送響應 - 我必須重新啟動應用程序服務器。

擁有單個MQTTclient實例是一種好方法嗎? 可以一直保持連接嗎? 這種要求的最佳方法是什么?

這是我的代碼:

public static void registerCallBack(String topicName, String userName,
        String password, String clientId, MqttCallback callback,
        MqttClient client) {
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(true);
    options.setKeepAliveInterval(30);
    options.setUserName(userName);
    options.setPassword(password.toCharArray());

    // Connect to Broker
    try {
        options.setSocketFactory(SslUtil.getSocketFactory(
                ManagerProps.MQTT_BROKER_CA_FILE.getValue(), ""));

        client.setCallback(callback);
        client.connect(options);
        client.subscribe(topicName, 0);
        log.info("successfuly registered callback to topic " + topicName);
    } catch (MqttException me) {
        log.error("MqttException, " + me);
    } catch (Exception e) {
        log.error("Exception, " + e);
    }
}

public static String publishMessage(MqttClient client, String message,
        String topic, String userName, String password) {
    MqttConnectOptions options = new MqttConnectOptions();
    options.setCleanSession(true);
    options.setKeepAliveInterval(30);
    options.setUserName(userName);
    options.setPassword(password.toCharArray());

    try {
        MqttMessage msg = new MqttMessage();
        msg.setPayload(message.getBytes());
        client.publish(topic, msg);
    } catch (MqttException e) {
        log.error("MqttException, " + e);
    } catch (Exception e) {
        log.error("Exception, " + e);
    }

    return message;
}

我看到類似的東西,並讓這個工作:

final CallbackConnection connection = mqtt.callbackConnection();
    connection.listener(new org.fusesource.mqtt.client.Listener() {

        public void onConnected() {
        }
        public void onDisconnected() {
        }
        public void onFailure(Throwable value) {
            value.printStackTrace();
            System.exit(-2);
        }
        public void onPublish(UTF8Buffer topic, Buffer msg, Runnable ack) {
            String body = msg.utf8().toString();
            if( body.startsWith("REPLY: ")) {     
                // Don't reply to your own reply             
                System.out.println("Replied");
                System.out.println("");
            } else {                    
              try{            
              byte[] reply = "REPLY: Hello Back".getBytes();
              connection.publish(destination, reply, QoS.AT_MOST_ONCE, true, null)  ;
              msg.clear();
            }catch (Exception e){
               e.printStackTrace();
            }  
            }
        }
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM