2013-11-14 6 views
3

У меня есть веб-сервер, который получает много сообщений в одну и ту же тему и возвращает ответные сообщения в другую тему.Повторное использование клиента MQTT для публикации/подписаться

В настоящее время я повторно использую тот же экземпляр клиента 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; 
} 
+0

Не могли бы вы добавить некоторые подробности о том, почему вы не в состоянии послать - исключения , блок по публикации, другой? –

+0

Это определенно хорошо, чтобы иметь один экземпляр и определенно нормально, чтобы он все время подключался. Однако я не могу помочь с кодом. – ralight

+0

@Anders Это странная вещь - нет никаких исключений или сообщений, которые так когда-либо были. когда я dubug его, я могу ясно видеть, что publish() выполняется без каких-либо исключений, но ничего не происходит ... –

ответ

0

я что-то подобное видел, и получил эту работу:

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(); 
      } 
      } 
     } 
    }); 
Смежные вопросы