MQTT client connectionLost не работает после переподключения к брокеру

Я новичок в MQTT. Я пытаюсь переподключиться к брокеру, когда клиент потерял соединение. Это моя функция:

@Override
public void connectionLost(Throwable cause) {
    // TODO Auto-generated method stub
    reconnectStatus = 0;

    executor.scheduleAtFixedRate(reconnectRunnable, 0, 5, TimeUnit.SECONDS); // reconnect every 5s

    System.out.println(cause);
}

И это функция для переподключения:

// reconnect to the broker
Runnable reconnectRunnable = new Runnable() {
    public void run() {
       if(reconnectStatus == 1) {
           System.out.println("Stop runnable!");
           executor.shutdown();
           return;
       } else {
           init();
       }
    }
};

Он работает нормально в первый раз при перезапуске брокера. Однако этот connectionLost() триггер не работает при втором перезапуске брокера. Как я могу это исправить?
Большое спасибо.


person mintquan    schedule 05.07.2018    source источник


Ответы (2)


Нет необходимости в дополнительном коде для автоматического переподключения, если вы используете this клиент mqtt

Вы можете указать параметр повторного подключения и очистки сеанса в MqttConnectOptions при создании MqttClient.

Образец кода:

public void initClinet(){
    MqttClient client=new MqttClient("server address", MqttClient.generateClientId());
    client.setCallback(new MyListener());
    MqttConnectOptions options = new MqttConnectOptions();
    options.setAutomaticReconnect(true);
    options.setCleanSession(true);
    options.setUserName("username");
    options.setPassword("password".toCharArray());
    options.setKeepAliveInterval(10);
    options.setCleanSession(false);
    client.connect(options);
    client.subscribe("channelname");    
}
person Nitin    schedule 04.10.2018

Для меня сработало использование Mqttclient.reconnect().

person user2183044    schedule 21.05.2020