2016-04-22 41 views
1

MQTTクライアントJavaライブラリーをいくつかのアプリケーションに使用しています。ブローカーに悪い方法で再接続していると思います。現時点では、接続、切断、公開、サブスクライブなどのMQTTアクションを処理するクラスがあります。Pahoドライバーを使用してMQTTに再接続する方法

public class MqttConnection { 

    private static final String BROKER_ADDRESS = Preferences.getProperty("mqtt-address"); 
    private static final String BROKER_PORT = Preferences.getProperty("mqtt-port"); 
    private static final String BROKER_URI = "tcp://" + BROKER_ADDRESS + ":" + BROKER_PORT; 

    private static final String VHOST = Preferences.getProperty("mqtt-vhost"); 
    private static final String USERNAME = Preferences.getProperty("mqtt-username"); 
    private static final String PASSWORD = Preferences.getProperty("mqtt-password"); 

    private static MqttClient client; 

    private static final Logger logger = LogManager.getLogger(MqttConnection.class); 

    static { 
     try { 
      client = new MqttClient(BROKER_URI, MqttClient.generateClientId()); 
     } catch (MqttException ex) { 
      logger.fatal(ex); 
     } 
     client.setCallback(new MqttCallback() { 
      @Override 
      public void connectionLost(Throwable thrwbl) { 
       logger.info("MQTT : Perte de connexion..."); 
       MqttConnection.start(); 
      } 

      @Override 
      public void messageArrived(String topic, MqttMessage message) throws Exception { 
       // CODE HERE 
      } 

      @Override 
      public void deliveryComplete(IMqttDeliveryToken imdt) { } 
     }); 
    } 

    public static void start() { 
     connect(); 
    } 

    private static void connect() { 
     if (!client.isConnected()) { 
      try { 
       if (Preferences.getProperty("mqtt-isauth").equalsIgnoreCase("true")) { 
        MqttConnectOptions options = new MqttConnectOptions(); 
        String username = (VHOST.equals("")) ? USERNAME : VHOST + ":" + USERNAME; 
        options.setUserName(username); 
        options.setPassword(PASSWORD.toCharArray()); 
        client.connect(options); 
       } else { 
        client.connect(); 
       } 
       logger.info("MQTT : Connecté au broker."); 
      } catch (MqttException ex) { 
       logger.fatal(ex); 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        logger.fatal(e); 
       } 
       connect(); 
      } 
     } 
    } 

    private static void subscribe() { 
     if (client.isConnected()) { 
      try { 
       client.subscribe("+/SWI1"); 
      } catch (MqttException e) { 
       logger.fatal(e); 
      } 
     } 
    } 
} 

しかし、再接続を試みると多くの接続が開いているように見え、ブローカのバグが発生します。 MQTTブローカーに再接続する最良の方法は何ですか?

答えて

0

MqttConnectOptions.setAutomaticReconnect(true)を使用すると、自動再接続を有効にすることができます。

関連する問題