解決 MQTT 用戶端程式無法連接至遙測 (MQXR) 服務的問題。
開始之前
問題是出在伺服器上、用戶端還是連線上? 您是否已使用 C 或 Java WebSphere® MQTT 用戶端撰寫自己的 MQTT v3 通訊協定處理用戶端或 MQTT 用戶端應用程式?
在伺服器上執行隨 WebSphere MQ Telemetry 提供的驗證應用程式,並檢查遙測通道及遙測 (MQXR) 服務是否正確執行。 隨後將驗證應用程式傳送至用戶端,並在用戶端上執行驗證應用程式。
關於此作業
有許多原因會使 MQTT 用戶端未連接至 Telemetry 伺服器,或者使您判斷它未連接至 Telemetry 伺服器。
程序
- 考量遙測 (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) 服務,但該服務已發現錯誤。
- 考量可從遙測 (MQXR) 服務未回應時用戶端所產生的原因碼推出的結論:
選項 |
說明 |
REASON_CODE_CLIENT_EXCEPTION REASON_CODE_CLIENT_TIMEOUT
|
在伺服器上尋找 FDC 檔案; 請參閱 伺服器端日誌。 當遙測 (MQXR) 服務偵測到用戶端逾時時,它會寫入首次失敗資料擷取 (FDC) 檔案。 無論連線何時非預期地岔斷,它都會寫入 FDC 檔。
|
遙測 (MQXR) 服務可能未回應用戶端,並且用戶端逾時到期。 只有在應用程式設定無限期逾時時時, WebSphere MQ Telemetry Java 用戶端才會當掉。 在為 MqttClient.Connect
設定的逾時到期之後,如果發生無法診斷的問題,則用戶端會擲出這三個異常狀況之一。
除非您找到與連線失敗關聯的 FDC 檔,否則您無法推斷出該用戶端嘗試連接至伺服器:
- 確認用戶端已傳送連線要求。
- 用戶端使用的遠端 Socket 位址與定義給遙測通道的 Socket 位址是否相符?
IBM WebSphere MQ Telemetry 隨附的 Java SE MQTT 用戶端中的預設檔案持續性類別會建立名稱如下的資料夾: clientIdentifier-tcphostName埠 或用戶端工作目錄中的 clientIdentifier-sslhostName埠 。 資料夾名稱會告訴您連線嘗試中使用的 hostName 及 埠; 請參閱 用戶端日誌檔。
- 您可以 ping 遠端伺服器位址嗎?
- 伺服器上的 netstat 是否顯示遙測通道正在用戶端所連接的埠上執行?
- 檢查遙測 (MQXR) 服務是否在用戶端要求中發現問題。
遙測 (MQXR) 服務會將其偵測到的錯誤寫入 mqxr.log,而佇列管理程式會將錯誤寫入 AMQERR01.LOG;請參閱
- 嘗試透過執行另一個用戶端隔離問題。
在伺服器平台上執行程式範例以排除網路連線相關的不確定問題,然後在用戶端平台上執行範例。
- 要檢查的其他內容:
- 是否有成千上萬的 MQTT 用戶端同時嘗試連接?
遙測通道具有佇列,可以緩存送入連線待辦事項。 每秒處理的連線數超過
10,000。 可使用「 IBM WebSphere MQ 探險家」中的遙測通道精靈來配置待辦事項緩衝區的大小。 其預設大小為 4096。 檢查待辦事項是否配置為較低的值。
- 遙測 (MQXR) 服務及佇列管理程式仍在執行中嗎?
- 用戶端是否已連接至已切換其 TCP/IP 位址的高可用性佇列管理程式?
- 防火牆是否選擇性地過濾掉出埠或傳回資料封包?