AWSIotMqttClient getConnectionStatus() не показывает фактическое состояние соединения

#java #spring #amazon-web-services #aws-iot

#java #весна #amazon-веб-сервисы #aws-iot

Вопрос:

У меня есть приложение, которое подписано на некоторые темы и публикует некоторые события по этой теме. Планировщик периодически проверяет соединение. Что — то вроде этого:

 AWSIotMqttClient client = new AWSIotMqttClient(
        mqttBrokerAddress,
        clientId,
        keyStore,
        keyPassword
);  // it is a bean
 

Планировщик получает статус соединения и, если соединение потеряно, пытается восстановить соединение:

 var status = client.getConnectionStatus();
log.debug("Connection status is "   status.name());
if (status != AWSIotConnectionStatus.CONNECTED)
client.connect();
 

Когда я прерываю соединение, я вижу, что планировщик регистрирует состояние соединения CONNECTED через долгое время после потери соединения, и мое приложение пытается публиковать сообщения. Только через 20 минут я вижу DISCONNECTED статус в журналах и MqttException и UnknownHostException .

Когда я повторно подключаюсь к Интернету, я также вижу DISCONNECTED статус в журналах, и мой клиент не смог подключиться к AWS. Я подумал, что это что-то с моим интернет-провайдером, когда я закрываю и снова открываю соединение. Но когда я остановил приложение и подключение к Интернету и снова запустил его вместе, мое приложение подключилось к AWS сразу после запуска.

Как мне получить фактический статус соединения с AWSIotMqttClient помощью ?

Ответ №1:

Насколько я понимаю getConnectionStatus() , метод получает значение некоторой connection переменной, установленной при connect disconnect вызове методов or. Он не проверяет соединение. Поэтому, чтобы проверить соединение, я опубликовал сообщение по некоторой теме, и если соединение потеряно, я получаю исключение. И в блоке catch я отключаюсь, чтобы установить правильное значение:

 try {
    awsIotMqttClient.publish("connection", AWSIotQos.QOS1, "Check connection", 60000);
} catch (Exception e) {
    log.error("It seems connection lost. Disconnecting...");
    awsIotMqttClient.disconnect();
}