MQTT Connector のトラブルシューティング

MQTT 用 Anypoint Connector (MQTT Connector) のトラブルシューティングを行うには、冗長ログの有効化と、スローされる一般的なメッセージの解釈に関する情報を理解しておきます。

冗長ログの有効化

コネクタの冗長ログを有効化するには、コネクタと Eclipse Paho ドライバーのログをアクティブ化する必要があります。

MQTT Connector の冗長ログの有効化

設定ファイルで冗長ログを有効にする手順は、次のとおりです。

  1. Anypoint Studio にアクセスし、​[Package Explorer]​ ビューに移動します。

  2. アプリケーションのプロジェクト名を開きます。

  3. src/main/resources​ パスフォルダーを開きます。

  4. フォルダー内の ​log4j2.xml​ ファイルを開きます。

  5. <Loggers>​ タグ内に ​<AsyncLogger>​ タグを追加します。

    			<Loggers>
    				...
    				<AsyncLogger name="com.mulesoft.connectors.mqtt3" level="TRACE"/>
    				...
    			</Loggers>
    xml
  6. アプリケーションの変更を保存します。

  7. Package Explorer​ でプロジェクト名をクリックし、​[Run (実行)]​ > ​[Run As (別のユーザーとして実行)]​ > ​[Mule Application (Mule アプリケーション)]​ をクリックします。

Eclipse Paho ドライバーの冗長ログの有効化

MQTT Connector の基盤となるドライバーである Eclipse Paho では、Java Util Logging が使用されます。アプリケーションのログファイルでドライバーのログメッセージを確認する必要がある場合は、次の手順に従ってアプリケーションに最新の ​log4j-jul-2.xx.x.jar​ バージョンを提供します。

  1. {MULE_HOME}/lib/boot​ にある ​log4j-core-2.xx.x.jar​ のファイル名内のバージョンサフィックスを確認して、​log4j​ コアモジュールバージョンを識別します。

    埋め込み Mule Runtime Engine (Mule) の場合は、​{AnypointStudio Folder}/Contents/Eclipse/plugins/org.mule.tooling.server.4.3.0.ee_7.3.5.202005112043/mule/lib/boot​ に似たフォルダーを見つけます。

  2. 公開 Maven リポジトリから同じバージョンの ​log4j-jul-2.xx.x.jar​ をダウンロードします。たとえば、Mule 4.3.0 の場合は ​log4j-jul-2.13.1.jar​ になります。

  3. log4j-jul-2.xx.x.jar​ を ​{MULE_HOME}/lib/boot​ に配置します。

  4. Apache Logging ServicesLeaving the Site​ サイトで文書化されているロギングレベルのマッピングに従って、Mule アプリケーションで、対応する ​java.util.logging​ カテゴリを追加します。次に例を示します。

    `<AsyncLogger name="org.eclipse.paho.client.mqttv3.logging.JSR47Logger" level="ALL"/>`
    xml

    level​ 属性では、Java Util Logging レベルを指定する必要があります。詳細は、 Apache Logging ServicesLeaving the Site​ で Java Util Logging レベルの変換テーブルを参照し、その同等の Log4j レベルを確認してください。

Mosquitto Broker の冗長ログの有効化

ロギングを設定するためのメカニズムはブローカーごとに異なります。Mosquitto ブローカーとロギングレベルを設定する手順は、次のとおりです。

  1. 公式 Docker イメージを使用して、Mosquitto ブローカーをセットアップします。これを行うには、次のコマンドを実行します。

docker run -it -p 1883:1883 \ -v /your/local/path/mosquitto.log:/mosquitto/mosquitto.log \ -v /your/local/path/mosquitto.conf:/mosquitto/config/mosquitto.conf eclipse-mosquitto

このコマンドを使用して、ログファイル ​mosquitto.log​ と設定ファイル ​mosquitto.conf​ を指定します。

  • mosquitto.log​ は、ブローカーがログメッセージを書き込むファイルです。

  • mosquitto.conf​ は、ブローカーの設定ファイルです。

  1. mosquitto.conf​ 設定ファイルで目的のログレベルを設定します。次に例を示します。

    # Unencrypted MQTT over TCP
    # for listener at port 1883
    listener 1883
    allow_anonymous true
    # =================================================================
    # Logging
    # =================================================================
    # Route log messages to log file
    log_dest file /mosquitto/mosquitto.log
    # Types of messages to log. Use multiple log_type lines for logging
    # multiple types of messages.
    log_type debug
    log_type error
    log_type warning
    log_type notice
    log_type information
    text

前述のファイルの最初の 2 行でポート 1883 のリスナーをセットアップします。認証ログイン情報は必須ではありません。

ロギングセクションで、マウントした ​mosquitto.log​ ファイルにログを書き込む必要があることと、ブローカーですべてのレベルのメッセージを記録する必要があることを指定します。

テストで何が必要かに応じて、異なる設定を持つさまざまなリスナーを追加できます。次に例を示します。

per_listener_settings true

# Unencrypted MQTT over TCP
listener 1883
allow_anonymous true

# Unencrypted MQTT over TCP
listener 1884
password_file /mosquitto/config/mosquitto.passwd

listener 8080
protocol websockets
allow_anonymous true
text

前述のファイルでは、3 個の個別のリスナーを設定しました。

  • ポート 1883 では、MQTT 経由の匿名接続を許可するエンドポイントを指定しました。

  • ポート 1884 では、パスワードファイルを指定しました。ブローカーはここで認証用のユーザー名とパスワードが見つかることを期待します。

  • ポート 8080 では、WebSockets 接続を許可することを指定しました。

個別の設定を使用して個々の各リスナーを設定するには、まず ​per_listener_settings true​ を設定する必要があります。

一般的なスローの理解

ここでは、一般的なスローメッセージとその解決方法を示します。

  • MQTT3:CONNECTIVITY

    メッセージのパブリッシュ中にクライアントがブローカーから切断されました。
  • MQTT3:INVALID_TOPIC

    トピックが無効です。たとえば、名前が短すぎるか、名前が長すぎるか、名前に無効な文字が含まれます。
  • MQTT3:PERSISTENCE

    メッセージのパブリッシュ時に、信頼性の高いメッセージング用の永続的なデータの読み取りまたは書き込み中にエラーが発生しました。
  • MQTT3:PUBLISH

    メッセージのパブリッシュ中にエラーが発生しました。
  • MQTT3:RETRY_EXHAUSTED

    すべての再接続の試行に失敗しました。
  • MQTT3:WRITE_TIMEOUT

    サーバーへのメッセージの書き込みを待機している間にクライアントがタイムアウトしてエラーが発生しました。