[AIX][Windows][Linux]

正在解决问题: MQTT 客户机连接已断开

了解在成功建立连接并且运行较短或较长一段时间之后导致客户机抛出意外的 ConnectionLost 异常的原因。

开始之前

MQTT 客户机已成功连接。 客户机可能已启动较长一段时间。 如果不同客户机之间的启动时间间隔较短,那么从成功连接到连接断开之间的时间可能较短。

区分“已断开的连接”与“已成功建立连接、但是稍后又断开的连接”并不难。 断开的连接由调用 MqttCallback.ConnectionLost 方法的 MQTT 客户机定义。 仅在已成功建立连接之后才调用此方法。 症状不同于 MqttClient.Connect 在接收到否定确认信息或者超时之后抛出异常。

如果 MQTT 客户机应用程序未使用 IBM® MQ提供的 MQTT 客户机库,那么症状取决于客户机。 在 MQTT v3 协议中,症状是缺少对服务器请求的及时响应,或者 TCP/IP 连接失败。

关于本任务

MQTT 客户机调用 MqttCallback.ConnectionLost 时发生可抛出异常,以响应在接收到肯定连接应答后迂到的任何服务器端问题。 当 MQTT 客户机从 MqttTopic.publishMqttClient.subscribe 返回时,会将请求传输到负责发送和接收消息的 MQTT 客户机线程。 通过将可抛出异常传递至 ConnectionLost 回调方法,从而以异步方式报告服务器端错误。

过程

  1. 是否已启动另一个使用相同 ClientIdentifier 的客户机?

    如果使用同一 ClientIdentifier 启动另一客户机,或重新启动同一客户机,那么将断开与第一个客户机的首次连接。

  2. 是否客户机访问了一个未授权它发布或预订的主题?

    如果遥测服务代表客户机执行的任何操作返回 MQCC_FAIL,那么将导致此服务断开客户机连接。

    原因码未返回给客户机。
    • mqxr.logAMQERR01.LOG 文件中查找客户机所连接到的队列管理器的日志消息; 请参阅 服务器端日志
  3. TCP/IP 连接是否已断开?

    防火墙可能具有较低的超时设置,以将 TCPIP 连接标记为不活动状态并且断开连接。

    • 使用 MqttConnectOptions.setKeepAliveInterval 来缩短不活动 TCPIP 连接时间。