解決問題:MQTT 用戶端連線中斷

找出導致用戶端在順利連接並執行或長或短的一段時間之後,擲出非預期的 ConnectionLost 異常狀況的原因。

開始之前

MQTT 用戶端已順利連接。 用戶端可能會執行一長段時間。 如果用戶端啟動間隔很短,則順利連接與連接中斷之間的時間可能很短。

區分中斷的連線與成功建立、隨後中斷的連線並不困難。 中斷的連線由 MQTT 用戶端呼叫 MqttCallback.ConnectionLost 方法來定義。 該方法僅在順利建立連線之後呼叫。 該症狀與 MqttClient.Connect 在收到負面確認通知或逾時之後擲出異常狀況不同。

如果 MQTT 用戶端應用程式未使用 IBM® WebSphere® MQ提供的 MQTT 用戶端程式庫,則症狀取決於用戶端。 在 MQTT v3 通訊協定中,症狀是伺服器要求的回應不及時,或者 TCP/IP 連線失敗。

關於此作業

MQTT 用戶端利用可擲出異常狀況呼叫 MqttCallback.ConnectionLost,以回應在收到正面連線確認通知之後發生的伺服器端問題。 MQTT 用戶端從 MqttTopic.publishMqttClient.subscribe 返回時,會將該要求傳送至負責傳送和接收訊息的 MQTT 用戶端執行緒。 會透過將可擲出異常狀況傳遞至 ConnectionLost 回呼方法,來以非同步方式報告伺服器端錯誤。

遙測 (MQXR) 服務一律寫入首次失敗資料擷取檔案(如果它中斷連線的話)。

程序

  1. 是否已啟動另一個使用相同 ClientIdentifier的用戶端?

    如果已啟動第二個用戶端或已重新啟動相同的用戶端(使用相同的 ClientIdentifier),則會中斷與第一個用戶端的第一個連線。

  2. 用戶端是否存取了未獲授權來發佈至或訂閱的主題?

    Telemetry 服務代表用戶端執行的所有動作,它們傳回 MQCC_FAIL 導致服務中斷用戶端連線連線。

    不會將原因碼傳回至用戶端。
    • 在用戶端所連接佇列管理程式的 mqxr.logAMQERR01.LOG 檔案中尋找日誌訊息; 請參閱 伺服器端日誌
  3. TCP/IP 連線是否已中斷?

    防火牆可能設定較低的逾時以將 TCPIP 連線標示為非作用中,從而中斷連線。

    • 使用 MqttConnectOptions.setKeepAliveInterval 縮短非作用中的 TCPIP 連線時間。