Todos los productos
Search
Centro de documentos

ApsaraMQ for RocketMQ:Envío de mensajes normales en modo síncrono, asíncrono o unidireccional

Última actualización: Sep 04, 2026

ApsaraMQ for RocketMQ admite tres modos de transmisión para mensajes normales. Elija un modo según el nivel de garantía de entrega que requiera su aplicación:

Modo

Comportamiento

Recomendado para

Síncrono

El productor espera la confirmación del broker antes de enviar el siguiente mensaje.

Escenarios que requieren confirmación de entrega

Asíncrono

El productor envía un mensaje y continúa inmediatamente. Un callback devuelve el resultado.

Flujos de trabajo sensibles a la latencia

Unidireccional

El productor envía un mensaje sin esperar ninguna respuesta.

Escenarios de alto throughput donde es aceptable la pérdida ocasional de mensajes

Requisitos previos

Antes de empezar, asegúrese de contar con lo siguiente:

Configuración común del productor

Los tres modos comparten la misma lógica de inicialización. Cree un productor una sola vez y luego invoque el método de envío correspondiente al modo deseado.

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();

Reemplace el marcador de posición con su valor real:

Marcador de posición

Descripción

Ejemplo

<your-tcp-endpoint>

El endpoint TCP de su instancia

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

Construcción de un mensaje

Cada llamada de envío requiere un objeto Message. El constructor acepta tres 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");
Un topic utilizado para mensajes normales no puede usarse para otros tipos de mensajes, como los transaccionales o programados.

Transmisión síncrona

El productor envía un mensaje y se bloquea hasta que el broker devuelve una respuesta. Si no se lanza ninguna excepción, el mensaje se entregó correctamente.

Synchronous transmission

Cuándo usarla: Escenarios que requieren confirmación de entrega, como notificaciones por correo electrónico, alertas de registro o mensajes promocionales.

Código de ejemplo

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();
    }
}

Transmisión asíncrona

El productor envía un mensaje y retorna de inmediato. La respuesta del broker se entrega mediante un SendCallback con dos métodos: onSuccess y onException.

Asynchronous transmission

Cuándo usarla: Flujos de trabajo sensibles a la latencia donde el hilo invocador no puede bloquearse; por ejemplo, al enviar un trabajo de transcodificación de video y gestionar el resultado en un callback.

Código de ejemplo

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

Transmisión unidireccional

El productor envía un mensaje y continúa su ejecución. No se devuelve ninguna respuesta ni se activa ningún callback. Este modo ofrece el mayor throughput a costa de la fiabilidad, ya que un mensaje puede enviarse en microsegundos.

One-way transmission

Cuándo usarla: Escenarios de alto volumen donde es aceptable la pérdida ocasional de mensajes, como la recolección de registros o el reporte de métricas.

Aviso

El broker no envía respuesta en el modo unidireccional, por lo que los mensajes fallidos se pierden silenciosamente. Si la pérdida de datos no es aceptable, utilice la transmisión síncrona o asíncrona en su lugar.

Código de ejemplo

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);
}

Cierre del productor

Cierre el productor antes de que su aplicación finalice para liberar recursos.

producer.shutdown();
Cerrar el productor libera memoria. Si su aplicación envía mensajes con frecuencia, mantenga el productor en ejecución en lugar de crearlo y destruirlo por cada solicitud.

Comparación de los modos de transmisión

Los tres modos difieren en si el productor espera una respuesta del broker y en el equilibrio entre throughput y fiabilidad.

Modo

Método de envío

TPS

Respuesta del broker

Fiabilidad

Caso de uso típico

Síncrono

producer.send(msg)

Alto

Sí: el productor se bloquea hasta que el broker confirma el mensaje

Sin pérdida de mensajes

Notificaciones, confirmaciones de pedidos

Asíncrono

producer.sendAsync(msg, callback)

Alto

Sí: se entrega mediante SendCallback

Sin pérdida de mensajes

Transcodificación de video, flujos de trabajo asíncronos

Unidireccional

producer.sendOneway(msg)

Máximo

No: el broker no responde, por lo que el productor no puede detectar fallos

Posible pérdida de mensajes

Recolección de registros, métricas

Pasos siguientes