Todos os produtos
Search
Central de documentação

ApsaraMQ for MQTT:Exportar dados do ApsaraMQ for MQTT para o ApsaraMQ for RocketMQ

Última atualização: Aug 28, 2026

As regras de saída de dados encaminham mensagens do ApsaraMQ for MQTT para o ApsaraMQ for RocketMQ. Isso permite que aplicações backend consumam mensagens MQTT com recursos nativos do RocketMQ, como mensagens ordenadas e transacionais.

Atualmente, o ApsaraMQ for MQTT suporta troca de dados apenas com o ApsaraMQ for RocketMQ. Este tutorial aborda duas tarefas: crie uma regra de saída de dados no console e execute um exemplo em Java que publica mensagens via MQTT pela Internet e as consome a partir do RocketMQ.

Como funciona

O fluxo de exportação de dados tem três etapas:

  1. Cliente MQTT publica uma mensagem. Um dispositivo ou aplicação se conecta ao ApsaraMQ for MQTT e publica uma mensagem em um tópico MQTT (por exemplo, sensor/temperature).

  2. Regra de saída de dados encaminha a mensagem. O ApsaraMQ for MQTT compara a mensagem com as regras de saída configuradas e a encaminha para o tópico correspondente no ApsaraMQ for RocketMQ.

  3. Consumidor RocketMQ recebe a mensagem. Uma aplicação backend assina o tópico do RocketMQ e processa a mensagem encaminhada usando recursos como rastreamento de mensagens e tentativas automáticas.

Architecture diagram

Limitações

  • As regras de saída de dados aceitam apenas instâncias do ApsaraMQ for RocketMQ 4.x como destino.

  • Não há suporte para encaminhamento entre regiões. A instância MQTT e a instância RocketMQ devem estar na mesma região.

Acesso à rede

O ApsaraMQ for MQTT oferece dois tipos de endpoints:

Tipo de endpoint

Caso de uso

Public Endpoint

Acesso pela Internet. Geralmente utilizado por dispositivos IoT e móveis.

VPC Endpoint

Acesso dentro de uma Virtual Private Cloud (VPC). Comumente usado por aplicações em cloud.

Importante

Utilize sempre o nome de domínio, e não o endereço IP resolvido, para conectar os clientes. Os endereços IP mudam dinamicamente durante atualizações de resolução de nomes de domínio. O ApsaraMQ for MQTT não se responsabiliza por falhas e perdas diretas ou indiretas causadas pelo uso de endereços IP fixos no código ou regras de firewall baseadas em IPs.

Pré-requisitos

Antes de começar, certifique-se de ter:

Etapa 1: Crie uma regra de saída de dados

  1. Acesse o console do ApsaraMQ for MQTT. No painel de navegação à esquerda, clique em Instances.

  2. Na barra de navegação superior, selecione a região da sua instância. Clique no nome da instância para abrir a página Instance Details.

  3. No painel de navegação à esquerda, clique em Rules. No canto superior esquerdo, clique em Create Rule.

  4. Preencha o assistente Create Rule:

    1. Configure Basic Information: Insira um ID de regra e defina Rule Type como Data Outbound.

      Configure basic information

    2. Configure Rule Source: Selecione um tópico na sua instância do ApsaraMQ for MQTT.

      Configure rule source

    3. Configure Rule Destination: Escolha sua instância do ApsaraMQ for RocketMQ e um tópico nessa instância.

      Configure rule destination

Etapa 2: Configure o projeto de exemplo

Baixe o código de exemplo

  1. Clone ou baixe o projeto mqtt-java-demo.

  2. Abra a pasta lmq-java-demo no IntelliJ IDEA.

  3. Verifique se o arquivo pom.xml inclui as seguintes dependências:

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

Configure credenciais de acesso

  1. Obtenha um par de AccessKey. Para mais detalhes, consulte Criar um par de AccessKey.

  2. Defina as seguintes variáveis de ambiente. Para mais informações, consulte Configurar uma credencial de acesso.

    Variável

    Descrição

    MQTT_AK_ENV

    AccessKey ID

    MQTT_SK_ENV

    AccessKey secret

Importante

Não codifique pares de AccessKey diretamente no código-fonte. Armazene-os em variáveis de ambiente para evitar exposição acidental.

Etapa 3: Execute o código de exemplo

A classe MQ4IoTSendMessageToRocketMQ.java demonstra todo o fluxo de dados: ela envia mensagens pelo ApsaraMQ for MQTT e as consome via ApsaraMQ for RocketMQ. Antes de executar o exemplo, substitua os espaços reservados pelas informações dos seus recursos.

Substitua os seguintes espaços reservados:

Espaço reservado

Descrição

Onde encontrar

GID-XXXXX

ID do grupo RocketMQ

Console do ApsaraMQ for RocketMQ

http://xxxxx.XXXXX.mq-internet.aliyuncs.com

Endpoint TCP do RocketMQ

Página Instance Details no console do ApsaraMQ for RocketMQ

XXXXX (parentTopic)

Nome do tópico RocketMQ

Console do ApsaraMQ for RocketMQ

XXXXX (instanceId)

ID da instância MQTT

Página Instance Details no console do ApsaraMQ for MQTT

XXXXXX.mqtt.aliyuncs.com

Endpoint MQTT

Página Instance Details no console do ApsaraMQ for MQTT

GID_XXXX@@@XXXXX

ID do cliente MQTT (formato: GroupID@@@DeviceID)

Gere usando seu ID de grupo MQTT e um ID de dispositivo único

Requisitos do Client ID:

  • Formato: GroupID@@@DeviceID. O ID do grupo é aquele criado no console do ApsaraMQ for MQTT. O ID do dispositivo é um identificador personalizado.

  • Comprimento máximo: 64 caracteres.

  • Cada conexão TCP deve usar um client ID exclusivo. IDs duplicados causam exceções de conexão e desconexões inesperadas.

Código de exemplo

O código de exemplo inicializa um consumidor RocketMQ que assina um tópico, cria um cliente MQTT que publica 10 mensagens de teste em um subtópico e utiliza a regra de saída de dados para encaminhar essas mensagens ao tópico RocketMQ para consumo.

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. Initialize the RocketMQ consumer (backend application)
        // ============================================================
        Properties properties = new Properties();

        // RocketMQ group ID
        properties.setProperty(PropertyKeyConst.GROUP_ID, "GID-XXXXX");

        // Load credentials from environment variables
        properties.put(PropertyKeyConst.AccessKey, System.getenv("MQTT_AK_ENV"));
        properties.put(PropertyKeyConst.SecretKey, System.getenv("MQTT_SK_ENV"));

        // RocketMQ TCP endpoint (from the Instance Details page)
        properties.put(PropertyKeyConst.NAMESRV_ADDR,
            "http://xxxxx.XXXXX.mq-internet.aliyuncs.com");

        // RocketMQ topic (must be a parent topic for MQTT-RocketMQ data exchange)
        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. Initialize the MQTT client (device or mobile app)
        // ============================================================

        // MQTT instance ID
        String instanceId = "XXXXX";

        // MQTT endpoint (from the Instance Details page)
        String endPoint = "XXXXXX.mqtt.aliyuncs.com";

        // Load credentials from environment variables
        String accessKey = System.getenv("MQTT_AK_ENV");
        String secretKey = System.getenv("MQTT_SK_ENV");

        // Client ID: GroupID@@@DeviceID (must be unique per TCP connection)
        String clientId = "GID_XXXX@@@XXXXX";

        // Subtopic: parentTopic + "/" + subtopic name (max 128 characters)
        final String mq4IotTopic = parentTopic + "/" + "testMq4Iot";

        // QoS level: 0, 1, or 2
        final int qosLevel = 0;

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

        // Protocol and port: tcp://endpoint:1883 or ssl://endpoint:8883
        final MqttClient mqttClient =
            new MqttClient("tcp://" + endPoint + ":1883", clientId, memoryPersistence);

        // Client timeout in milliseconds
        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. Publish 10 test messages
        // ============================================================
        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);
    }
}

Etapa 4: Verifique o resultado

Após executar a classe MQ4IoTSendMessageToRocketMQ, valide a entrega de mensagens ponta a ponta usando um dos métodos abaixo.

Verifique a saída do código

Se a saída do console exibir mensagens semelhantes às seguintes, o cliente MQTT enviou as mensagens e o consumidor RocketMQ as recebeu:

Code verification output

Verifique no console

Confirme que as mensagens foram enviadas:

  1. Acesse a página Instance Details no console do ApsaraMQ for MQTT.

  2. No painel de navegação à esquerda, clique em Message Trace Query.

  3. Pesquise por ID do grupo e ID do dispositivo para confirmar que as mensagens foram publicadas.

Message Trace Query

Confirme que as mensagens foram consumidas:

  1. Acesse a página Instance Details no console do ApsaraMQ for RocketMQ.

  2. No painel de navegação à esquerda, clique em Message Query.

  3. Pesquise por tópico para confirmar que as mensagens foram encaminhadas ao RocketMQ.

Message Query

  1. Clique em Message Trace na coluna Actions para verificar se a mensagem foi consumida.

Message Trace details

Próximos passos