Todos os produtos
Search
Central de documentação

ApsaraMQ for RocketMQ:Send normal messages in synchronous, asynchronous, or one-way mode

Última atualização: Jun 27, 2026

O ApsaraMQ for RocketMQ oferece três modos de transmissão para mensagens normais. Escolha o modo adequado conforme o nível de garantia de entrega exigido pela sua aplicação:

Modo

Comportamento

Mais indicado para

Síncrono

O produtor aguarda a confirmação do broker antes de enviar a próxima mensagem.

Cenários que exigem confirmação de entrega

Assíncrono

O produtor envia a mensagem e continua imediatamente. Um callback retorna o resultado.

Fluxos de trabalho sensíveis à latência

Unidirecional

O produtor envia a mensagem sem esperar resposta.

Cenários de alto throughput em que perda ocasional de mensagens é aceitável

Pré-requisitos

Antes de começar, verifique se você possui:

Configuração comum do produtor

Os três modos compartilham a mesma lógica de inicialização. Crie um produtor uma única vez e chame o método de envio específico do modo desejado.

import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.SendResult;
import com.aliyun.openservices.ons.api.SendCallback;
import com.aliyun.openservices.ons.api.OnExceptionContext;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.PropertyKeyConst;

import java.util.Date;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

Properties properties = new Properties();
// Read credentials from environment variables.
properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Send timeout in milliseconds.
properties.setProperty(PropertyKeyConst.SendMsgTimeoutMillis, "3000");
// TCP endpoint. Find this in the TCP Endpoint section of the Instance Details page
// in the ApsaraMQ for RocketMQ console.
properties.put(PropertyKeyConst.NAMESRV_ADDR, "<your-tcp-endpoint>");

Producer producer = ONSFactory.createProducer(properties);
// Call start() once before sending any messages.
producer.start();

Substitua o placeholder pelo valor real:

Placeholder

Descrição

Exemplo

<your-tcp-endpoint>

O endpoint TCP da sua instância

http://MQ_INST_xxxxx.mq-internet.region.aliyuncs.com:80

Construção da mensagem

Toda chamada de envio requer um objeto Message. O construtor aceita três argumentos:

Message msg = new Message(
    "TopicTestMQ",          // Topic -- must be a normal-message topic
    "TagA",                 // Tag -- used by consumers to filter messages
    "Hello MQ".getBytes()   // Body -- binary payload; producer and consumer must
                            // agree on the serialization format
);

// Optional: set a business key for message tracing in the console.
msg.setKey("ORDERID_100");
Um tópico usado para mensagens normais não pode ser utilizado para outros tipos de mensagem, como transacionais ou agendadas.

Transmissão síncrona

O produtor envia a mensagem e bloqueia a execução até receber uma resposta do broker. Se nenhuma exceção for lançada, a entrega foi bem-sucedida.

Synchronous transmission

Quando usar: Cenários que exigem confirmação de entrega, como notificações por e-mail, alertas de cadastro ou mensagens promocionais.

Código de exemplo

for (int i = 0; i < 100; i++) {
    Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
    msg.setKey("ORDERID_" + i);

    try {
        SendResult sendResult = producer.send(msg);
        // A non-null result means the broker accepted the message.
        if (sendResult != null) {
            System.out.println(new Date() + " Send mq message success. Topic is:"
                + msg.getTopic() + " msgId is: " + sendResult.getMessageId());
        }
    } catch (Exception e) {
        // Handle failures: retry or persist the message for later delivery.
        System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
        e.printStackTrace();
    }
}

Transmissão assíncrona

O produtor envia a mensagem e retorna imediatamente. A resposta do broker chega por meio de um SendCallback com dois métodos: onSuccess e onException.

Asynchronous transmission

Quando usar: Fluxos sensíveis à latência em que a thread chamadora não pode ficar bloqueada — por exemplo, ao submeter um job de transcodificação de vídeo e tratar o resultado em um callback.

Código de exemplo

Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
msg.setKey("ORDERID_100");

producer.sendAsync(msg, new SendCallback() {
    @Override
    public void onSuccess(final SendResult sendResult) {
        System.out.println("send message success. topic=" + sendResult.getTopic()
            + ", msgId=" + sendResult.getMessageId());
    }

    @Override
    public void onException(OnExceptionContext context) {
        // Handle failures: retry or persist the message for later delivery.
        System.out.println("send message failed. topic=" + context.getTopic()
            + ", msgId=" + context.getMessageId());
    }
});

// Block for 3 seconds to wait for the callback. In production, use a
// CountDownLatch or similar mechanism instead of Thread.sleep.
TimeUnit.SECONDS.sleep(3);

Transmissão unidirecional

O produtor dispara a mensagem e segue adiante. Nenhuma resposta é retornada e nenhum callback é acionado. Esse modo oferece o maior throughput possível, mas reduz a confiabilidade — uma mensagem pode ser enviada em microssegundos.

One-way transmission

Quando usar: Cenários de alto volume em que perda ocasional de mensagens é aceitável, como coleta de logs ou relatório de métricas.

Aviso

No modo unidirecional, o broker não envia resposta, portanto mensagens com falha são perdidas silenciosamente. Se a perda de dados não for aceitável, utilize a transmissão síncrona ou assíncrona.

Código de exemplo

for (int i = 0; i < 100; i++) {
    Message msg = new Message("TopicTestMQ", "TagA", "Hello MQ".getBytes());
    msg.setKey("ORDERID_" + i);

    // No return value, no callback. Fire and forget.
    producer.sendOneway(msg);
}

Encerramento do produtor

Encerre o produtor antes que sua aplicação finalize para liberar recursos.

producer.shutdown();
O encerramento do produtor libera memória. Se sua aplicação envia mensagens com frequência, mantenha o produtor ativo em vez de criá-lo e destruí-lo a cada requisição.

Comparação entre os modos de transmissão

Os três modos diferem quanto à espera pela resposta do broker e ao equilíbrio entre throughput e confiabilidade.

Modo

Método de envio

TPS

Resposta do broker

Confiabilidade

Caso de uso típico

Síncrono

producer.send(msg)

Alto

Sim — o produtor bloqueia até o broker confirmar a mensagem

Sem perda de mensagens

Notificações, confirmações de pedido

Assíncrono

producer.sendAsync(msg, callback)

Alto

Sim — entregue via SendCallback

Sem perda de mensagens

Transcodificação de vídeo, fluxos assíncronos

Unidirecional

producer.sendOneway(msg)

Mais alto

Não — o broker não responde, então o produtor não detecta falhas

Possível perda de mensagens

Coleta de logs, métricas

Próximos passos