すべてのプロダクト
Search
ドキュメントセンター

ApsaraMQ for MQTT:ApsaraMQ for MQTT から ApsaraMQ for RocketMQ へのデータエクスポート

最終更新日:Aug 29, 2026

データアウトバウンドルールは、ApsaraMQ for MQTT から ApsaraMQ for RocketMQ にメッセージを転送します。これにより、バックエンドアプリケーションは、順序メッセージやトランザクションメッセージなどの RocketMQ ネイティブ機能を使用して MQTT メッセージをコンシュームできます。

現在、ApsaraMQ for MQTT は ApsaraMQ for RocketMQ とのみデータ交換をサポートしています。このチュートリアルでは、2 つのタスクを説明します。コンソールでデータアウトバウンドルールを作成することと、インターネット経由で MQTT を使用してメッセージをパブリッシュし、RocketMQ からコンシュームする Java サンプルを実行することです。

仕組み

データエクスポートのフローは 3 つの段階で構成されます:

  1. MQTT クライアントがメッセージをパブリッシュします。 デバイスまたはアプリケーションが ApsaraMQ for MQTT に接続し、MQTT トピック (例: sensor/temperature) にメッセージをパブリッシュします。

  2. データアウトバウンドルールがメッセージを転送します。 ApsaraMQ for MQTT は、設定済みのデータアウトバウンドルールに対してメッセージを照合し、マッピングされた ApsaraMQ for RocketMQ トピックに転送します。

  3. RocketMQ コンシューマーがメッセージを受信します。 バックエンドアプリケーションが RocketMQ トピックをサブスクライブし、メッセージトレースやリトライなどの RocketMQ 機能を使用して転送されたメッセージを処理します。

Architecture diagram

制限事項

  • データアウトバウンドルールは、宛先として 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:データアウトバウンドルールの作成

  1. ApsaraMQ for MQTT コンソールにログインします。左側メニューで、[Instances] をクリックします。

  2. 上部メニューで、インスタンスのリージョンを選択します。インスタンス名をクリックして、[Instance Details] ページを開きます。

  3. 左側メニューで、[Rules] をクリックします。左上で、[Create Rule] をクリックします。

  4. [ルールの作成] ウィザードを完了します:

    1. [Configure Basic Information]:ルール ID を入力し、[Rule Type] を [Data Outbound] に設定します。

      Configure basic information

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

      Configure rule source

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

      Configure rule destination

手順 2:サンプルプロジェクトのセットアップ

サンプルコードのダウンロード

  1. mqtt-java-demo プロジェクトをクローンまたはダウンロードします。

  2. IntelliJ IDEA で mqtt-java-demo フォルダーを開きます。

  3. 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>

アクセス認証情報の設定

  1. AccessKey ペアを取得します。詳細については、「Create an AccessKey pair」をご参照ください。

  2. 次の環境変数を設定します。詳細については、「Configure an access credential」をご参照ください。

    変数説明
    MQTT_AK_ENVアクセスキー ID
    MQTT_SK_ENVシークレットアクセスキー
重要

AccessKey ペアをソースコードにハードコードしないでください。誤って漏えいしないように、環境変数に保存してください。

手順 3:サンプルコードの実行

MQ4IoTSendMessageToRocketMQ.java クラスは、データフロー全体を示します。ApsaraMQ for MQTT 経由でメッセージを送信し、ApsaraMQ for RocketMQ 経由でメッセージをコンシュームします。サンプルを実行する前に、プレースホルダーの値を実際のリソース情報に置き換えてください。

次のプレースホルダーを置き換えます:

プレースホルダー説明確認場所
GID-XXXXXRocketMQ グループ IDApsaraMQ for RocketMQ コンソール
http://xxxxx.XXXXX.mq-internet.aliyuncs.comRocketMQ NameServer アドレスApsaraMQ for RocketMQ コンソールの [Instance Details] ページ
XXXXX (parentTopic)RocketMQ トピック名ApsaraMQ for RocketMQ コンソール
XXXXX (instanceId)MQTT インスタンス IDApsaraMQ for MQTT コンソールの [Instance Details] ページ
XXXXXX.mqtt.aliyuncs.comMQTT エンドポイントApsaraMQ for MQTT コンソールの [Instance Details] ページ
GID_XXXX@@@XXXXXMQTT クライアント ID (形式: GroupID@@@DeviceID)MQTT グループ ID と一意のデバイス ID を使用して生成します

クライアント ID の要件:

  • 形式:GroupID@@@DeviceID。グループ ID は ApsaraMQ for MQTT コンソールで作成したものです。デバイス ID はカスタム識別子です。

  • 最大長:64 文字。

  • 各 TCP 接続では、一意のクライアント ID を使用する必要があります。クライアント ID が重複すると、接続例外や予期しない切断が発生します。

サンプルコード

サンプルコードは、トピックをサブスクライブする RocketMQ コンシューマーを初期化し、サブトピックに 10 件のテストメッセージをパブリッシュする MQTT クライアントを作成します。その後、データアウトバウンドルールによってこれらのメッセージが RocketMQ トピックに転送され、コンシュームされます。

import com.aliyun.openservices.lmq.example.util.ConnectionOptionWrapper;
import com.aliyun.openservices.ons.api.Action;
import com.aliyun.openservices.ons.api.ConsumeContext;
import com.aliyun.openservices.ons.api.Consumer;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.MessageListener;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import java.util.Properties;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class MQ4IoTSendMessageToRocketMQ {
    public static void main(String[] args) throws Exception {
        // ============================================================
        // 1. RocketMQ コンシューマー (バックエンドアプリケーション) を初期化
        // ============================================================
        Properties properties = new Properties();

        // RocketMQ グループ ID
        properties.setProperty(PropertyKeyConst.GROUP_ID, "GID-XXXXX");

        // 環境変数から認証情報を読み込み
        properties.put(PropertyKeyConst.AccessKey, System.getenv("MQTT_AK_ENV"));
        properties.put(PropertyKeyConst.SecretKey, System.getenv("MQTT_SK_ENV"));

        // RocketMQ NameServer アドレス (Instance Details ページから取得)
        properties.put(PropertyKeyConst.NAMESRV_ADDR,
            "http://xxxxx.XXXXX.mq-internet.aliyuncs.com");

        // RocketMQ トピック (MQTT-RocketMQ データ交換では親トピックである必要があります)
        final String parentTopic = "XXXXX";

        Consumer consumer = ONSFactory.createConsumer(properties);
        consumer.subscribe(parentTopic, "*", new MessageListener() {
            public Action consume(Message message, ConsumeContext consumeContext) {
                System.out.println("recv msg:" + message);
                return Action.CommitMessage;
            }
        });
        consumer.start();

        // ============================================================
        // 2. MQTT クライアント (デバイスまたはモバイルアプリ) を初期化
        // ============================================================

        // MQTT インスタンス ID
        String instanceId = "XXXXX";

        // MQTT エンドポイント (Instance Details ページから取得)
        String endPoint = "XXXXXX.mqtt.aliyuncs.com";

        // 環境変数から認証情報を読み込み
        String accessKey = System.getenv("MQTT_AK_ENV");
        String secretKey = System.getenv("MQTT_SK_ENV");

        // クライアント ID:GroupID@@@DeviceID (TCP 接続ごとに一意である必要があります)
        String clientId = "GID_XXXX@@@XXXXX";

        // サブトピック:parentTopic + "/" + サブトピック名 (最大 128 文字)
        final String mq4IotTopic = parentTopic + "/" + "testMq4Iot";

        // QoS レベル:0、1、または 2
        final int qosLevel = 0;

        ConnectionOptionWrapper connectionOptionWrapper =
            new ConnectionOptionWrapper(instanceId, accessKey, secretKey, clientId);
        final MemoryPersistence memoryPersistence = new MemoryPersistence();

        // プロトコルとポート:tcp://endpoint:1883 または ssl://endpoint:8883
        final MqttClient mqttClient =
            new MqttClient("tcp://" + endPoint + ":1883", clientId, memoryPersistence);

        // クライアントのタイムアウト (ミリ秒)
        mqttClient.setTimeToWait(5000);
        mqttClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                System.out.println("connect success");
            }

            @Override
            public void connectionLost(Throwable throwable) {
                throwable.printStackTrace();
            }

            @Override
            public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
                System.out.println("send msg succeed topic is : "
                    + iMqttDeliveryToken.getTopics()[0]);
            }
        });
        mqttClient.connect(connectionOptionWrapper.getMqttConnectOptions());

        // ============================================================
        // 3. 10 件のテストメッセージをパブリッシュ
        // ============================================================
        for (int i = 0; i < 10; i++) {
            MqttMessage message = new MqttMessage("hello mq4Iot pub sub msg".getBytes());
            message.setQos(qosLevel);
            mqttClient.publish(mq4IotTopic, message);
        }
        Thread.sleep(Long.MAX_VALUE);
    }
}

手順 4:結果の確認

MQ4IoTSendMessageToRocketMQ クラスを実行した後、次のいずれかの方法でエンドツーエンドのメッセージ配信を確認できます。

コード出力の確認

コンソール出力に次のようなメッセージが表示される場合、MQTT クライアントがメッセージを送信し、RocketMQ コンシューマーが受信したことを示しています。

Code verification output

コンソールの確認

メッセージが送信されたことを確認:

  1. ApsaraMQ for MQTT コンソールで [Instance Details] ページに移動します。

  2. 左側メニューで、[Message Trace Query] をクリックします。

  3. グループ ID とデバイス ID で検索して、メッセージがパブリッシュされたことを確認します。

Message Trace Query

メッセージがコンシュームされたことを確認:

  1. ApsaraMQ for RocketMQ コンソールで [Instance Details] ページに移動します。

  2. 左側メニューで、[Message Query] をクリックします。

  3. トピックで検索して、メッセージが RocketMQ に転送されたことを確認します。

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

Message Trace details

次のステップ