#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();
}