Todos os produtos
Search
Central de documentação

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

Última atualização: Sep 21, 2026

Se você quiser usar recursos específicos do ApsaraMQ for RocketMQ, como mensagens ordenadas e mensagens transacionais, em aplicações em cloud, use regras de entrada ou saída de dados para trocar dados entre o ApsaraMQ for MQTT e o ApsaraMQ for RocketMQ. Este tópico descreve como importar dados do ApsaraMQ for RocketMQ para o ApsaraMQ for MQTT.

Informações de contexto

O ApsaraMQ for MQTT oferece suporte a SDKs de cloud. Conecte aplicações em cloud aos brokers do ApsaraMQ for MQTT para enviar e receber mensagens usando esses SDKs. Para obter informações sobre como usar os SDKs de cloud, consulte Cloud SDK overview.

O ApsaraMQ for MQTT também permite a troca de dados entre o ApsaraMQ for MQTT e outros services da Alibaba Cloud. Atualmente, a troca de dados é suportada apenas entre o ApsaraMQ for MQTT e o ApsaraMQ for RocketMQ.

Este tópico descreve como importar dados do ApsaraMQ for RocketMQ para o ApsaraMQ for MQTT pela Internet usando o SDK para Java.

quick_start_data_inflow

Acesso à rede

O ApsaraMQ for MQTT fornece o Public Endpoint e o VPC Endpoint.

  • O Public Endpoint é um endereço IP usado para acessar o ApsaraMQ for MQTT pela Internet. Na maioria dos casos, os endpoints públicos são utilizados em cenários de IoT e Internet móvel.

  • O VPC Endpoint é um endereço IP usado para acessar o ApsaraMQ for MQTT em uma virtual private cloud (VPC). Geralmente, os endpoints de VPC são usados por aplicações em cloud para se conectarem ao ApsaraMQ for MQTT.

Importante

Se você for usar um endpoint para conectar um cliente ao ApsaraMQ for MQTT, utilize o nome de domínio em vez do endereço IP, pois o IP muda dinamicamente. A equipe técnica do ApsaraMQ for MQTT não se responsabiliza por falhas e perdas diretas ou indiretas nos seguintes cenários:

  • Você usa um endereço IP para acessar seu cliente no ApsaraMQ for MQTT. Após a equipe técnica do ApsaraMQ for MQTT atualizar a resolução do nome de domínio, o endereço IP original se torna inválido.

  • Uma política de firewall para endereços IP está configurada na rede onde seu cliente está em execução. Após a equipe técnica do ApsaraMQ for MQTT atualizar a resolução do nome de domínio, os novos endereços IP são bloqueados devido à política de firewall.

Pré-requisitos

  • O ambiente de desenvolvimento integrado (IDE) está instalado. Para mais informações, consulte IDE. Você pode usar o IntelliJ IDEA ou o Eclipse. Este exemplo utiliza o IntelliJ IDEA.

  • O Java 8 ou 11 está instalado. Para mais informações, consulte Java Downloads.

  • Uma instância do ApsaraMQ for MQTT foi criada, e um tópico e um grupo foram criados nessa instância. Para mais informações, consulte Create resources.

  • Uma instância do ApsaraMQ for RocketMQ foi criada, e um tópico e um grupo foram criados nessa instância. Para mais informações, consulte Create resources.

Importante
  • As regras de entrada de dados do ApsaraMQ for MQTT permitem importar dados apenas de instâncias do ApsaraMQ for RocketMQ 4.x.

  • Não é possível usar as regras de entrada de dados do ApsaraMQ for MQTT entre regiões diferentes. Ao criar uma regra de entrada de dados, certifique-se de que os recursos do ApsaraMQ for MQTT e do ApsaraMQ for RocketMQ estejam na mesma região.

1. Criar uma regra de entrada de dados

  1. Faça login no ApsaraMQ for MQTT console. No painel de navegação à esquerda, clique em Instances.

  2. Na barra de navegação superior, selecione a região onde reside a instância que você deseja gerenciar. Na página Instances, clique no nome da instância para acessar a página Instance Details.

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

  4. No assistente Create Rule, execute as seguintes etapas:

    1. Na etapa Configure Basic Information, especifique um ID de regra e selecione Data Inbound para o parâmetro Rule Type.

      image

    2. Na etapa Configure Rule Source, selecione uma instância do ApsaraMQ for RocketMQ já criada e um tópico criado nessa instância.

      image

    3. Na etapa Configure Rule Destination, selecione um tópico já criado na instância do ApsaraMQ for MQTT.

      image

2. Preparar o código de teste

2,1 Baixar o código de exemplo

  1. Baixe o projeto de demonstração mqtt-java-demo e descompacte o pacote do projeto em uma pasta na sua máquina local.

  2. No projeto descompactado, localize a pasta lmq-java-demo, importe-a para o IntelliJ IDEA e confirme se as seguintes dependências estão incluídas no arquivo 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>
  3. Configure as credenciais de acesso.

    • Obtenha um par de AccessKey. Para obter informações sobre como obter um par de AccessKey, consulte Create an AccessKey.

    • Configure as variáveis de ambiente. O nome da variável de ambiente do AccessKey ID usado para acessar o ApsaraMQ for MQTT é MQTT_AK_ENV, e o nome da variável de ambiente do AccessKey secret usado para acessar o ApsaraMQ for MQTT é MQTT_SK_ENV. Para obter informações sobre como configurar variáveis de ambiente, consulte Configure access credentials.

2,2 Configurar o código para envio de mensagens

A classe RocketMQSendMessageToMQ4IoT.java contém o código para enviar mensagens usando o ApsaraMQ for RocketMQ e receber mensagens usando o ApsaraMQ for MQTT. Especifique os parâmetros dos recursos do ApsaraMQ for RocketMQ e do ApsaraMQ for MQTT com base nos comentários do código.

Ao testar o envio de mensagens, você pode comentar o código relacionado ao envio de mensagens ponto a ponto (P2P). Código de exemplo:

Sample code for messaging

import com.aliyun.openservices.lmq.example.util.ConnectionOptionWrapper;
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.SendResult;
import java.util.Properties;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
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.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;

public class RocketMQSendMessageToMQ4IoT {
    public static void main(String[] args) throws Exception {
        /**
         * Initialize an ApsaraMQ for RocketMQ client as a sender. In most business scenarios, the sender is deployed on a backend application. 
         */
        Properties properties = new Properties();
        /**
         * The ID of the group that you created in the ApsaraMQ for RocketMQ console. 
         */
        properties.setProperty(PropertyKeyConst.GROUP_ID, "GID-XXXXX");
        /**
         * The AccessKey ID that you created in the Alibaba Cloud Resource Access Management (RAM) console for identity authentication. 
         * The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. To prevent security risks, we recommend that you use a RAM user to call API operations or perform routine O&M. 
         * We strongly recommend that you do not save an AccessKey pair in the project code. Otherwise, the AccessKey pair may be leaked and all resources in your account may be exposed to potential security risks. 
         * In this example, the AccessKey ID and AccessKey secret are stored in environment variables. 
         */
        properties.put(PropertyKeyConst.AccessKey, System.getenv("MQTT_AK_ENV"));
        /**
         * The AccessKey secret that you created in the Alibaba Cloud RAM console for identity authentication. The AccessKey secret is required only if you use the signature authentication mode. 
         */
        properties.put(PropertyKeyConst.SecretKey, System.getenv("MQTT_SK_ENV"));
        /**
         * The TCP endpoint that is used to access the ApsaraMQ for RocketMQ instance. You can obtain the TCP endpoint on the Instance Details page in the ApsaraMQ for RocketMQ console. 
         */
        properties.put(PropertyKeyConst.NAMESRV_ADDR, "XXXX");
        /**
         * The ApsaraMQ for RocketMQ topic. You can create a topic in the ApsaraMQ for RocketMQ console. 
         * When you exchange data between ApsaraMQ for RocketMQ and ApsaraMQ for MQTT, only parent topics can be used by the ApsaraMQ for RocketMQ client. 
         */
        final String parentTopic = "XXXXX";
        Producer producer = ONSFactory.createProducer(properties);
        producer.start();
        //////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        /**
         * Initialize an ApsaraMQ for MQTT client as a receiver. In most business scenarios, the receiver is deployed on a mobile terminal. 
         */

        /**
         * The ID of the ApsaraMQ for MQTT instance that you created in the ApsaraMQ for MQTT console. 
         */
        String instanceId = "XXXXX";
        /**
         * The endpoint that you want to use to access the ApsaraMQ for MQTT instance. You can obtain the endpoint on the Instance Details page in the ApsaraMQ for MQTT console. 
         */
        String endPoint = "XXXXXX.mqtt.aliyuncs.com";
        /**
         * The AccessKey ID that you created in the Alibaba Cloud RAM console for identity authentication. 
         * The AccessKey pair of an Alibaba Cloud account has permissions on all API operations. To prevent security risks, we recommend that you use a RAM user to call API operations or perform routine O&M. 
         * We strongly recommend that you do not save an AccessKey pair in the project code. Otherwise, the AccessKey pair may be leaked and all resources in your account may be exposed to potential security risks. 
         * In this example, the AccessKey ID and AccessKey secret are stored in environment variables. 
         */
        String accessKey = System.getenv("MQTT_AK_ENV");
        /**
         * The AccessKey secret that you created in the Alibaba Cloud RAM console for identity authentication. This parameter is required only if you use the signature authentication mode. 
         */
        String secretKey = System.getenv("MQTT_SK_ENV");
        /**
         * The globally unique ID that the system assigns to the ApsaraMQ for MQTT client. The client ID must vary based on the TCP connection. If multiple TCP connections use the same client ID, exceptions occur and the connections are unexpectedly closed. 
         * The client ID consists of a group ID and a device ID and is in the GroupID@@@DeviceID format. The group ID is the ID of the group that you created in the ApsaraMQ for MQTT console. The device ID is a custom ID that you specify. The client ID cannot exceed 64 characters in length. 
         */
        String clientId = "GID_XXXX@@@XXXXX";
        /**
         * ApsaraMQ for MQTT allows you to use a subtopic to filter messages. You can specify a string as the name of the subtopic. 
         * The value of the mq4IotTopic parameter can be up to 128 characters in length. 
         */
        final String subTopic = "/testMq4Iot";
        final String mq4IotTopic = parentTopic + subTopic;
        /**
         * The quality of service (QoS) level for message transmission. Valid values: 0, 1, and 2. For more information, see Terms. 
         */
        final int qosLevel = 0;
        ConnectionOptionWrapper connectionOptionWrapper = new ConnectionOptionWrapper(instanceId, accessKey, secretKey, clientId);
        final MemoryPersistence memoryPersistence = new MemoryPersistence();
        /**
         * The protocol and port that are used by the ApsaraMQ for MQTT client. The protocol and port that are used by the ApsaraMQ for MQTT client must match. If Secure Sockets Layer (SSL) encryption is used, specify ssl://endpoint:8883 as the protocol and port. 
         */
        final MqttClient mqttClient = new MqttClient("tcp://" + endPoint + ":1883", clientId, memoryPersistence);
        /**
         * The timeout period during which the ApsaraMQ for MQTT client waits for a response. The timeout period prevents the ApsaraMQ for MQTT client from waiting for a response for an indefinite period of time. 
         */
        mqttClient.setTimeToWait(5000);
        final ExecutorService executorService = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>());
        mqttClient.setCallback(new MqttCallbackExtended() {
            @Override
            public void connectComplete(boolean reconnect, String serverURI) {
                /**
                 * The topic to which the consumer must subscribe at the earliest opportunity after the client connection is established. 
                 */
                System.out.println("connect success");
                executorService.submit(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            final String topicFilter[] = {mq4IotTopic};
                            final int[] qos = {qosLevel};
                            mqttClient.subscribe(topicFilter, qos);
                        } catch (MqttException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }

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

            @Override
            public void messageArrived(String s, MqttMessage mqttMessage) throws Exception {
                /**
                 * The callback that is invoked to consume the messages that are published. Make sure that the callback does not throw exceptions. If a response is returned for the callback, the messages are consumed. 
                 * The messages must be consumed within a specific period of time. If a message is not consumed within the timeout period specified by the ApsaraMQ for MQTT broker, the broker may attempt to resend the message. Make sure that deduplication is performed to ensure idempotence for message consumption. 
                 */
                System.out.println(
                    "receive msg from topic " + s + " , body is " + new String(mqttMessage.getPayload()));
            }

            @Override
            public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
                System.out.println("send msg succeed topic is : " + iMqttDeliveryToken.getTopics()[0]);
            }
        });
        mqttClient.connect(connectionOptionWrapper.getMqttConnectOptions());
        for (int i = 0; i < 10; i++) {
            /**
             * Specify the parent topic as the topic and MQ2MQTT as the tag when you use the ApsaraMQ for RocketMQ client to send messages to the ApsaraMQ for MQTT client. 
             */
            Message msg = new Message(parentTopic, "MQ2MQTT", "hello mq send mqtt msg".getBytes());
            /**
             * You can use the MqttSecondTopic parameter to specify a subtopic when you use the ApsaraMQ for RocketMQ client to send messages to the ApsaraMQ for MQTT client. 
             */
            msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, subTopic);
            SendResult result = producer.send(msg);
            System.out.println(result);
//            /**
//             * Send a P2P message and specify a subtopic. 
//             */
//            msg.putUserProperties(PropertyKeyConst.MqttSecondTopic, "/p2p/" + clientId);
//            result = producer.send(msg);
//            System.out.println(result);
        }
        Thread.sleep(Long.MAX_VALUE);

    }

}

3. Verificar o resultado

Chame a função main na classe RocketMQSendMessageToMQ4IoT.java e use um dos seguintes métodos para verificar o envio e o consumo de uma mensagem.

Usar o código

Se um código semelhante ao seguinte for exibido, a mensagem foi enviada pelo ApsaraMQ for RocketMQ e consumida pelo ApsaraMQ for MQTT.

image

Usar o console

  • Verifique se a mensagem foi enviada. Acesse a página de detalhes da instância no console do ApsaraMQ for RocketMQ e clique em Message Query no painel de navegação à esquerda. Na página Message Query, verifique se a mensagem foi enviada por tópico e ID da mensagem.

    image

  • Verifique se a mensagem foi consumida. Acesse a página de detalhes da instância no console do ApsaraMQ for MQTT e clique em Message trace query no painel de navegação à esquerda. Na página Message Trace Query, verifique se a mensagem foi consumida pelo ID da mensagem.

    image

Referências