データアウトバウンドルールは、ApsaraMQ for MQTT から ApsaraMQ for RocketMQ にメッセージを転送します。これにより、バックエンドアプリケーションは、順序メッセージやトランザクションメッセージなどの RocketMQ ネイティブ機能を使用して MQTT メッセージをコンシュームできます。
現在、ApsaraMQ for MQTT は ApsaraMQ for RocketMQ とのみデータ交換をサポートしています。このチュートリアルでは、2 つのタスクを説明します。コンソールでデータアウトバウンドルールを作成することと、インターネット経由で MQTT を使用してメッセージをパブリッシュし、RocketMQ からコンシュームする Java サンプルを実行することです。
仕組み
データエクスポートのフローは 3 つの段階で構成されます:
MQTT クライアントがメッセージをパブリッシュします。 デバイスまたはアプリケーションが ApsaraMQ for MQTT に接続し、MQTT トピック (例:
sensor/temperature) にメッセージをパブリッシュします。データアウトバウンドルールがメッセージを転送します。 ApsaraMQ for MQTT は、設定済みのデータアウトバウンドルールに対してメッセージを照合し、マッピングされた ApsaraMQ for RocketMQ トピックに転送します。
RocketMQ コンシューマーがメッセージを受信します。 バックエンドアプリケーションが RocketMQ トピックをサブスクライブし、メッセージトレースやリトライなどの RocketMQ 機能を使用して転送されたメッセージを処理します。

制限事項
データアウトバウンドルールは、宛先として ApsaraMQ for RocketMQ 4.x インスタンスのみをサポートします。
クロスリージョン転送はサポートされていません。MQTT インスタンスと RocketMQ インスタンスは同一リージョンに配置する必要があります。
ネットワークアクセス
ApsaraMQ for MQTT は 2 種類のエンドポイントを提供します:
| エンドポイントのタイプ | ユースケース |
|---|---|
| [パブリックエンドポイント] | インターネット経由でアクセスします。通常、IoT デバイスやモバイルデバイスで使用します。 |
| [VPC エンドポイント] | 仮想プライベートクラウド (VPC) 内でアクセスします。通常、クラウドアプリケーションで使用します。 |
クライアントの接続には、名前解決された IP アドレスではなく、常にドメイン名を使用してください。IP アドレスは、名前解決の更新に伴って動的に変更されます。ハードコードされた IP アドレス、または IP アドレスに基づくファイアウォールルールの使用により発生した障害および直接的または間接的な損失について、ApsaraMQ for MQTT は責任を負いません。
前提条件
開始する前に、次の項目を用意してください:
IntelliJ IDEA または Eclipse がインストールされていること
Java 8 または 11 がインストールされていること
トピックとグループが作成済みの ApsaraMQ for MQTT インスタンス。詳細については、「Create resources」をご参照ください。
トピックとグループが作成済みの ApsaraMQ for RocketMQ 4.x インスタンス。詳細については、「Step 2: Create resources」をご参照ください。
認証用の AccessKey ペア。詳細については、「Create an AccessKey pair」をご参照ください。
手順 1:データアウトバウンドルールの作成
ApsaraMQ for MQTT コンソールにログインします。左側メニューで、[Instances] をクリックします。
上部メニューで、インスタンスのリージョンを選択します。インスタンス名をクリックして、[Instance Details] ページを開きます。
左側メニューで、[Rules] をクリックします。左上で、[Create Rule] をクリックします。
[ルールの作成] ウィザードを完了します:
[Configure Basic Information]:ルール ID を入力し、[Rule Type] を [Data Outbound] に設定します。

[Configure Rule Source]:ApsaraMQ for MQTT インスタンス上のトピックを選択します。

[Configure Rule Destination]:ApsaraMQ for RocketMQ インスタンスと、そのインスタンス上のトピックを選択します。

手順 2:サンプルプロジェクトのセットアップ
サンプルコードのダウンロード
mqtt-java-demo プロジェクトをクローンまたはダウンロードします。
IntelliJ IDEA で
mqtt-java-demoフォルダーを開きます。pom.xmlに次の依存関係が含まれていることを確認します:
<dependencies>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.70</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>com.aliyun.openservices</groupId>
<artifactId>ons-client</artifactId>
<version>1.8.5.Final</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-onsmqtt</artifactId>
<version>1.0.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.5.0</version>
</dependency>
</dependencies>アクセス認証情報の設定
AccessKey ペアを取得します。詳細については、「Create an AccessKey pair」をご参照ください。
次の環境変数を設定します。詳細については、「Configure an access credential」をご参照ください。
変数 説明 MQTT_AK_ENVアクセスキー ID MQTT_SK_ENVシークレットアクセスキー
AccessKey ペアをソースコードにハードコードしないでください。誤って漏えいしないように、環境変数に保存してください。
手順 3:サンプルコードの実行
MQ4IoTSendMessageToRocketMQ.java クラスは、データフロー全体を示します。ApsaraMQ for MQTT 経由でメッセージを送信し、ApsaraMQ for RocketMQ 経由でメッセージをコンシュームします。サンプルを実行する前に、プレースホルダーの値を実際のリソース情報に置き換えてください。
次のプレースホルダーを置き換えます:
| プレースホルダー | 説明 | 確認場所 |
|---|---|---|
GID-XXXXX | RocketMQ グループ ID | ApsaraMQ for RocketMQ コンソール |
http://xxxxx.XXXXX.mq-internet.aliyuncs.com | RocketMQ NameServer アドレス | ApsaraMQ for RocketMQ コンソールの [Instance Details] ページ |
XXXXX (parentTopic) | RocketMQ トピック名 | ApsaraMQ for RocketMQ コンソール |
XXXXX (instanceId) | MQTT インスタンス ID | ApsaraMQ for MQTT コンソールの [Instance Details] ページ |
XXXXXX.mqtt.aliyuncs.com | MQTT エンドポイント | ApsaraMQ for MQTT コンソールの [Instance Details] ページ |
GID_XXXX@@@XXXXX | MQTT クライアント ID (形式: GroupID@@@DeviceID) | MQTT グループ ID と一意のデバイス ID を使用して生成します |
クライアント ID の要件:
形式:
GroupID@@@DeviceID。グループ ID は ApsaraMQ for MQTT コンソールで作成したものです。デバイス ID はカスタム識別子です。最大長:64 文字。
各 TCP 接続では、一意のクライアント ID を使用する必要があります。クライアント ID が重複すると、接続例外や予期しない切断が発生します。
手順 4:結果の確認
MQ4IoTSendMessageToRocketMQ クラスを実行した後、次のいずれかの方法でエンドツーエンドのメッセージ配信を確認できます。
コード出力の確認
コンソール出力に次のようなメッセージが表示される場合、MQTT クライアントがメッセージを送信し、RocketMQ コンシューマーが受信したことを示しています。

コンソールの確認
メッセージが送信されたことを確認:
ApsaraMQ for MQTT コンソールで [Instance Details] ページに移動します。
左側メニューで、[Message Trace Query] をクリックします。
グループ ID とデバイス ID で検索して、メッセージがパブリッシュされたことを確認します。

メッセージがコンシュームされたことを確認:
ApsaraMQ for RocketMQ コンソールで [Instance Details] ページに移動します。
左側メニューで、[Message Query] をクリックします。
トピックで検索して、メッセージが RocketMQ に転送されたことを確認します。

[Actions] 列の [Message Trace] をクリックして、メッセージがコンシュームされたことを確認します。
