解決問題:MQTT 用戶端未連接

解決 MQTT 用戶端程式無法連接至遙測 (MQXR) 服務的問題。

開始之前

問題是出在伺服器上、用戶端還是連線上? 您是否已使用 C 或 Java WebSphere® MQTT 用戶端撰寫自己的 MQTT v3 通訊協定處理用戶端或 MQTT 用戶端應用程式?

在伺服器上執行隨 WebSphere MQ Telemetry 提供的驗證應用程式,並檢查遙測通道及遙測 (MQXR) 服務是否正確執行。 隨後將驗證應用程式傳送至用戶端,並在用戶端上執行驗證應用程式。

關於此作業

有許多原因會使 MQTT 用戶端未連接至 Telemetry 伺服器,或者使您判斷它未連接至 Telemetry 伺服器。

程序

  1. 考量遙測 (MQXR) 服務傳回 MqttClient.Connect的原因碼可以得出哪些推理。 連線失敗的類型為何?
    選項 說明
    REASON_CODE_INVALID_PROTOCOL_VERSION

    請確保 Socket 位址對應於遙測通道,而且您未將相同的 Socket 位址用於另一個分配管理系統。

    REASON_CODE_INVALID_CLIENT_ID

    請檢查用戶端 ID 不超過 23 個位元組,且只包含下列範圍內的字元: A-Z, a-z, 0-9, './_%

    REASON_CODE_INVALID_DESTINATION

    檢查用戶端 ID 與佇列管理程式名稱是否不同。

    REASON_CODE_SERVER_CONNECT_ERROR

    檢查遙測 (MQXR) 服務及佇列管理程式是否正常執行。 使用 netstat 來檢查 Socket 位址是否未配置給另一個應用程式。

    如果您已撰寫 MQTT 用戶端程式庫,而不是使用 IBM® WebSphere MQ Telemetry 提供的其中一個程式庫,請查看 CONNACK 回覆碼。

    從這三個錯誤中,您可以推斷用戶端已連接至遙測 (MQXR) 服務,但該服務已發現錯誤。

  2. 考量可從遙測 (MQXR) 服務未回應時用戶端所產生的原因碼推出的結論:
    選項 說明
    REASON_CODE_CLIENT_EXCEPTION
    REASON_CODE_CLIENT_TIMEOUT

    在伺服器上尋找 FDC 檔案; 請參閱 伺服器端日誌。 當遙測 (MQXR) 服務偵測到用戶端逾時時,它會寫入首次失敗資料擷取 (FDC) 檔案。 無論連線何時非預期地岔斷,它都會寫入 FDC 檔。

    遙測 (MQXR) 服務可能未回應用戶端,並且用戶端逾時到期。 只有在應用程式設定無限期逾時時時, WebSphere MQ Telemetry Java 用戶端才會當掉。 在為 MqttClient.Connect 設定的逾時到期之後,如果發生無法診斷的問題,則用戶端會擲出這三個異常狀況之一。

    除非您找到與連線失敗關聯的 FDC 檔,否則您無法推斷出該用戶端嘗試連接至伺服器:

    1. 確認用戶端已傳送連線要求。

      使用工具 (例如 tcpmon) 來檢查 TCPIP 要求,可從 https://java.net/projects/tcpmon 取得。

    2. 用戶端使用的遠端 Socket 位址與定義給遙測通道的 Socket 位址是否相符?

      IBM WebSphere MQ Telemetry 隨附的 Java SE MQTT 用戶端中的預設檔案持續性類別會建立名稱如下的資料夾: clientIdentifier-tcphostName 或用戶端工作目錄中的 clientIdentifier-sslhostName 。 資料夾名稱會告訴您連線嘗試中使用的 hostName; 請參閱 用戶端日誌檔

    3. 您可以 ping 遠端伺服器位址嗎?
    4. 伺服器上的 netstat 是否顯示遙測通道正在用戶端所連接的埠上執行?
  3. 檢查遙測 (MQXR) 服務是否在用戶端要求中發現問題。

    遙測 (MQXR) 服務會將其偵測到的錯誤寫入 mqxr.log,而佇列管理程式會將錯誤寫入 AMQERR01.LOG;請參閱

  4. 嘗試透過執行另一個用戶端隔離問題。
    • 使用相同的遙測通道執行 MQTT 範例應用程式。
    • 執行 wmqttSample GUI 用戶端,以驗證連線。 下載 SupportPac IA92以取得 wmqttSample
      附註: 舊版 IA92 不包括 MQTT v3 Java 用戶端程式庫。

    在伺服器平台上執行程式範例以排除網路連線相關的不確定問題,然後在用戶端平台上執行範例。

  5. 要檢查的其他內容:
    1. 是否有成千上萬的 MQTT 用戶端同時嘗試連接?

      遙測通道具有佇列,可以緩存送入連線待辦事項。 每秒處理的連線數超過 10,000。 可使用「 IBM WebSphere MQ 探險家」中的遙測通道精靈來配置待辦事項緩衝區的大小。 其預設大小為 4096。 檢查待辦事項是否配置為較低的值。

    2. 遙測 (MQXR) 服務及佇列管理程式仍在執行中嗎?
    3. 用戶端是否已連接至已切換其 TCP/IP 位址的高可用性佇列管理程式?
    4. 防火牆是否選擇性地過濾掉出埠或傳回資料封包?