メッセージ再パブリッシュ
データ統合を通じて、特定の条件を満たすメッセージをコードを書かずに他のトピックへ再パブリッシュすることが可能です。EMQXブローカーでは、ルールを作成し、ルールSQLでソースメッセージのデータをフィルタリング・処理し、「メッセージ再パブリッシュ」アクションをルールに追加して、処理結果をメッセージパブリッシュで転送できます。
本ページでは、任意のメッセージのmsgに文字列helloが含まれる場合に、そのメッセージをgreetトピックへ再パブリッシュするデータ統合の作成方法をデモンストレーションします。主な手順は以下の通りです。
- フィルタリング条件を設定するルールを作成する。
- メッセージ再パブリッシュ用のアクションをルールに追加する。
- データ統合の作成を完了し、テストを実施する。
データ統合によるメッセージ再パブリッシュの設定は、コネクターの追加を必要としません。以下のセクションで具体的な設定手順を説明します。
TIP
ルールのマッチおよびメッセージ再パブリッシュアクションの実行はデータ統合のTPSにカウントされます。アクションによって生成されたメッセージもデプロイメントのメッセージ受信TPSにカウントされます。再パブリッシュされたメッセージがサブスクライブクライアントに送信される場合、対応する配信はメッセージ送信TPSにカウントされます。
ルールの作成
データ統合ページのデータ転送サービスカテゴリで、Republishをクリックします。すでに他のコネクターを作成している場合は、新規コネクターをクリックし、データ転送サービスカテゴリの下にあるRepublishを選択します。
SQLエディターでルールSQLを定義し、任意のメッセージの
msgに文字列helloが含まれる場合にエンジンをトリガーするよう設定します。- FROM句でメッセージデータのソースを指定します。このデモでは全トピック(
#)のメッセージを対象とします。 - WHERE句でメッセージペイロード内の
msgに対して正規表現マッチングを行い、helloが含まれる場合にデータ統合を実行します。
上記の原則に基づくSQL例は以下の通りです。
sqlSELECT payload.msg as msg FROM "#" WHERE regex_match(msg, 'hello')- FROM句でメッセージデータのソースを指定します。このデモでは全トピック(
SQL入力ボックス下のTry It Outをクリックし、以下のデータを入力してテストできます。
- Topic: t/a
- Payload:
json{ "msg": "hello test" }Testをクリックし、出力結果を確認します。正しく設定されていれば、フィールドと値に完全なJSONデータが表示されます。
json{ "msg": "hello test" }テスト出力が期待通りであれば、次のステップに進めます。
注意: テストが失敗した場合は、SQLの準拠状況を確認してください。
アクションの追加
Serverlessの制限事項
Serverlessデプロイメントでは、再パブリッシュアクションはリテインドメッセージをパブリッシュできません。ルールは正常に実行され、現在のサブスクライバーへメッセージを配信しますが、後からサブスクライブするクライアント向けにメッセージを保存しません。ServerlessデプロイメントではDirect Dispatchが常に有効であり、無効化できません。リテインドメッセージを再パブリッシュアクションでパブリッシュするには、Dedicated Flexデプロイメントを使用してください。
新規ルールステップページで次へをクリックし、アクションを追加します。
新規アクションステップページで以下のパラメータを設定します。
- Connector: デフォルトの
Republishを保持します。 - Topic: 送信先トピックを
greetに設定します。 - Payload: メッセージ内容テンプレートに
${msg} -- forward from EMQX Cloudを入力します。 - QoS: デフォルト値を保持します。
- Connector: デフォルトの
必要に応じて、トグルスイッチをクリックしてMQTT 5.0 メッセージプロパティオプションを設定します。詳細はMQTT 5.0 メッセージプロパティを参照してください。
Direct Dispatchを有効にすると、メッセージが直接サブスクライバーに送信され、追加のルールトリガーや同じルールの再帰的トリガーを防止します。ServerlessデプロイメントではDirect Dispatchが常に有効で無効化できません。
確認をクリックしてアクションとルールの作成を完了します。
新規ルール作成成功のポップアップでルールに戻るをクリックし、メッセージ再パブリッシュのテストの手順に従ってルールをテストします。あるいは、ルールテストをクリックしてページ上でシミュレーションデータを入力しテストできます。詳細はルールテストを参照してください。
メッセージ再パブリッシュのテスト
MQTTX(https://mqttx.app/)を使用してメッセージ送信をシミュレートすることを推奨しますが、他の任意のクライアントでも可能です。
MQTTXを使ってデプロイメントに接続し、
testトピックに以下のメッセージを送信します。json{ "msg": "hello" }ルール一覧からメッセージ再パブリッシュルールを見つけ、ルールIDをクリックしてルール統計ページに入ります。関連する統計指標が表示されます。リセットボタンをクリックしてメトリクスデータをリセットできます。
TIP
Serverlessデプロイメントではメトリクスのリセットはサポートされていません。

クライアントで
greetトピックをサブスクライブします。msgにhelloが含まれる場合はメッセージが転送され、含まれない場合は転送されません。
アクションパラメータ
| パラメータ | 説明 |
|---|---|
| Topic | 再パブリッシュするメッセージの送信先トピックを設定します。${field}構文を用いた動的トピック構築に対応しています。入力ボックスに$を入力すると、使用可能な変数をドロップダウンリストから選択できます。 |
| QoS | 再パブリッシュするメッセージのQoSレベルを設定します。 |
| Retain | 再パブリッシュするメッセージをリテインドメッセージとしてパブリッシュするかを制御します。Dedicated Flexデプロイメントで設定可能です。Serverlessデプロイメントでは再パブリッシュアクションによるリテインドメッセージのパブリッシュはサポートされていません。 |
| Payload | 再パブリッシュするメッセージの本文内容を設定します。ルールSQLの出力フィールドを参照する${field}構文をサポートしています。エディターに$を入力すると使用可能な変数をドロップダウンリストから選択できます。${payload}を入力すると、元のメッセージと同じペイロードを変更せずに再パブリッシュします。 |
| MQTT 5.0 メッセージプロパティ | トグルスイッチをクリックして必要に応じてメッセージプロパティを設定します。再パブリッシュメッセージにリッチなメッセージメタデータを付加できます。詳細は以下を参照してください。 |
| Direct Dispatch | 有効にすると、メッセージが直接サブスクライバーに送信され、追加のルールトリガーや同じルールの再帰的な発動を防止します。 |
MQTT 5.0 メッセージプロパティ
| パラメータ | 説明 |
|---|---|
| Payload Format Indicator | ペイロードの形式を示します。falseの場合、メッセージは未定義のバイト列として扱われます。trueの場合、ペイロードはUTF-8エンコードされた文字データとして扱われ、クライアントが内容を効率的に解析できます。 |
| Message Expiry Interval | 配信先に届けられなかった場合にメッセージが失効するまでの秒数を指定します。 |
| Content Type | 再パブリッシュメッセージのペイロード内容の種類や形式(MIMEタイプ)を指定します。例:text/plain、audio/aac、application/jsonなど。 |
| Response Topic | 応答メッセージをパブリッシュするMQTTトピックを指定します。例:response/my_device。 |
| Correlation Data | 応答を元のリクエストに紐付けるための一意の識別子を入力します。トランザクションIDやリクエストIDなどが該当します。 |