# メッセージの再パブリッシュ

EMQX Platformのデータ統合を利用すると、特定の条件を満たすメッセージをコードを書かずに他のトピックへ再パブリッシュすることが可能です。EMQX Platformでは、ルールを作成し、ルールSQLでソースメッセージからのデータをフィルタリング・処理し、「メッセージの再パブリッシュ」アクションをルールに追加して、処理結果をメッセージパブリッシュで転送できます。

本ページでは、任意のメッセージの`msg`に文字列`hello`が含まれる場合に、そのメッセージを`greet`トピックへ再パブリッシュするデータ統合の作成方法をデモンストレーションします。主な手順は以下の通りです。

1. フィルタリング条件を設定するルールの作成
2. ルールにメッセージ再パブリッシュのアクションを追加
3. データ統合の作成完了および動作テスト

データ統合によるメッセージ再パブリッシュの設定は、コネクターの追加を必要としません。以下のセクションで具体的な設定手順を説明します。

## ルールの作成

1. **データ統合**ページで、**データ転送**サービスカテゴリの下にある**再パブリッシュ**をクリックします。すでに他のコネクターを作成している場合は、**新規コネクター**をクリックし、**データ転送**サービスカテゴリの中から**再パブリッシュ**を選択します。

2. **SQLエディター**でルールSQLを定義し、任意のメッセージの`msg`に文字列`hello`が含まれる場合にエンジンがトリガーされるようにします。

   - FROM句でメッセージデータのソースを指定します。このデモではすべてのトピック、すなわち`#`を対象とします。
   - WHERE句でペイロード内の`msg`に対して正規表現マッチングを行い、`hello`を含む場合にデータ統合を実行します。

   上記の内容に基づくSQL例は以下の通りです。

   ```sql
   SELECT
     payload.msg as msg
   FROM
     "#"
   WHERE  
     regex_match(msg, 'hello')
   ```

3. SQL入力欄下の**テスト有効化**をクリックし、以下のデータを入力してテストできます。

   - **トピック**: t/a
   - **ペイロード**:

   ```json
   {
     "msg": "hello test"
   }
   ```

   **テスト**をクリックし、**出力結果**を確認します。正しく設定されていれば、フィールドと値に以下のように完全なJSONデータが表示されます。

   ```json
   {
     "msg": "hello test"
   }
   ```

   テスト出力が期待通りであれば、次のステップに進んでください。

   > 注意: テストが失敗する場合は、SQLの記述が正しいかご確認ください。

## アクションの追加

1. **新規ルール**ステップページで**次へ**をクリックし、アクションを追加します。
2. **新規アクション**ステップページで以下の情報を設定します。
   - **コネクター**: デフォルトの`Republish`のままにします。
   - **トピック**: 送信先トピックを`greet`に設定します。
   - **ペイロード**: メッセージ内容のテンプレートとして`${msg} -- forward from EMQX Platform`を入力します。
   - QoSはデフォルト値のままにします。

3. 必要に応じて、トグルスイッチをクリックして**MQTT 5.0メッセージプロパティ**のオプションを設定できます。詳細は[再パブリッシュアクションの追加](https://docs.emqx.com/en/emqx/latest/data-integration/rule-get-started.html#add-republish-action)をご参照ください。
4. **直接ディスパッチ**を有効にする場合はトグルスイッチをクリックします。有効化するとメッセージはサブスクライバーに直接配信され、追加のルールトリガーや同一ルールの再帰的な起動を防止します。
5. **確認**をクリックしてアクションとルールの作成を完了します。
6. **新規ルール作成成功**のポップアップで**ルールへ戻る**をクリックし、[メッセージ再パブリッシュのテスト](#メッセージの再パブリッシュのテスト)の手順に従ってルールをテストします。あるいは、**ルールのテスト**をクリックしてページ上でシミュレーションデータを入力しテストすることも可能です。詳細は[ルールのテスト](#ルールのテスト)をご覧ください。

## メッセージの再パブリッシュのテスト

MQTTX（https://mqttx.app/）を使ってメッセージ送信をシミュレーションすることを推奨しますが、他の任意のクライアントでも構いません。

1. MQTTXを使ってデプロイ先に接続し、`test`トピックに以下のメッセージを送信します。

   ```json
   {
     "msg": "hello"
   }
   ```

2. ルール一覧からメッセージ再パブリッシュルールを見つけ、ルールIDをクリックしてルール統計ページに入ります。関連する統計指標がページ上に表示されます。

    ![rule_04](./_assets/rule_04.png)

3. クライアントで`greet`トピックをサブスクライブします。`msg`に`hello`が含まれる場合はメッセージが転送され、含まれない場合は転送されないことを確認できます。

    ![Republishing](./_assets/republish_02.png)
