首页 > 解决方案 > AWSIotMqttClient getConnectionStatus() 不显示实际连接状态

问题描述

我有一个订阅了一些主题并在该主题上发布一些事件的应用程序。调度程序定期检查连接。像这样的东西:

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在连接丢失很长时间后记录连接状态,并且我的应用程序尝试发布消息。DISCONNECTED仅在 20 分钟后,我在日志和 中MqttException看到了状态UnknownHostException

当我重新连接到网络时,我还会DISCONNECTED在日志中看到状态,并且我的客户端无法连接到 AWS。当我关闭并重新打开连接时,我认为这与我的互联网提供商有关。但是当我停止应用程序和互联网连接并再次一起启动时,我的应用程序在立即启动后连接到 AWS。

如何获得实际的连接状态AWSIotMqttClient

标签: javaspringamazon-web-servicesaws-iot

解决方案


据我了解,该方法在调用or方法时getConnectionStatus()获取某个connection变量集的值。它不验证连接。因此,为了验证连接,我发布了关于某个主题的消息,如果连接丢失,我会收到异常。在 catch 块中,我断开连接以设置正确的值:connectdisconnect

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

推荐阅读