Todos los productos
Search
Centro de documentos

ApsaraMQ for RocketMQ:Envío y suscripción a mensajes diferidos

Última actualización: Sep 04, 2026

Los mensajes diferidos permiten controlar cuándo un mensaje está disponible para su consumo. El broker de ApsaraMQ for RocketMQ retiene el mensaje diferido hasta la hora de entrega especificada y luego lo libera a los suscriptores. Los mensajes diferidos funcionan de manera similar a las colas diferidas.

Casos de uso comunes:

  • Gestión de tiempo de espera en pedidos: Cancele un pedido no pagado después de 30 minutos al enviar un mensaje diferido que active la lógica de cancelación.

  • Reintento con retroceso: Programe un intento de reintento tras una demora fija cuando una dependencia ascendente no esté disponible temporalmente.

  • Notificaciones aplazadas: Envíe un recordatorio o una notificación de seguimiento después de un período de espera configurable.

Para conocer los conceptos y restricciones, consulte Scheduled messages and delayed messages.

Requisitos previos

Antes de empezar, asegúrese de contar con a continuación:

  • El SDK de cliente TCP para Java instalado. Para más detalles, consulte Prepare the environment

  • Una instancia de ApsaraMQ for RocketMQ, un topic y un grupo de consumidores creados en la consola. Para más detalles, consulte Create resources

  • Un par de AccessKey para su cuenta de Alibaba Cloud. Para más detalles, consulte Create an AccessKey pair

  • (Opcional) Registros configurados. Para más detalles, consulte Logging settings

Funcionamiento de los mensajes diferidos

  1. El productor crea un mensaje y establece una hora de entrega mediante setStartDeliverTime().

  2. El broker recibe el mensaje y lo retiene hasta la hora de entrega especificada.

  3. En el momento de la entrega, el broker libera el mensaje al topic para que esté disponible para los consumidores.

Parámetro

Detalle

Formato de hora

Marca de tiempo absoluta en milisegundos (época Unix)

Valor mínimo

Debe ser posterior a la hora actual

Demora máxima

40 días a partir de la hora actual

Envío de mensajes diferidos

La única diferencia respecto al envío de un mensaje normal es una llamada de método: msg.setStartDeliverTime(delayTime). Esto establece la marca de tiempo absoluta (en milisegundos) en la que el broker entregará el mensaje.

Para consultar más ejemplos, revise la biblioteca de código de ApsaraMQ for RocketMQ.

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.Date;
import java.util.Properties;

public class ProducerDelayTest {
    public static void main(String[] args) {
        Properties properties = new Properties();
        // Retrieve the AccessKey pair from environment variables.
        // Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
        properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));

        // Specify the TCP endpoint.
        // Find this value 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();

        Message msg = new Message(
                "<your-topic>",       // Topic created in the console
                "DelayMessageTag",    // Tag for consumer-side filtering, similar to a Gmail tag
                "Hello MQ".getBytes() // Message body in binary format.
                                      // ApsaraMQ for RocketMQ does not process message bodies.
                                      // Producer and consumer must agree on serialization.
        );
        // Optional: set a business key for message tracing.
        // The key should be globally unique when possible. Use it to query
        // or resend messages in the ApsaraMQ for RocketMQ console.
        msg.setKey("ORDERID_100");

        try {
            // Set the delivery time to 3 seconds from now.
            // The value is an absolute timestamp in milliseconds.
            // The maximum delay that you can specify is 40 days.
            long delayTime = System.currentTimeMillis() + 3000;
            msg.setStartDeliverTime(delayTime);

            // Send the message in synchronous transmission mode.
            // If no exception is thrown, the message is sent.
            SendResult sendResult = producer.send(msg);
            if (sendResult != null) {
                System.out.println(new Date() + " Send mq message success. Topic is:"
                        + msg.getTopic() + " msgId is: " + sendResult.getMessageId());
            }
        } catch (Exception e) {
            // Handle send failure: log, retry, or persist the message.
            System.out.println(new Date() + " Send mq message failed. Topic is:" + msg.getTopic());
            e.printStackTrace();
        }

        // Shut down the producer when the application exits.
        // For high-throughput scenarios, keep the producer running and reuse it.
        producer.shutdown();
    }
}

Reemplace a continuación marcadores de posición con sus valores reales:

Marcador de posición

Descripción

Ejemplo

<your-tcp-endpoint>

Endpoint TCP de la página de detalles de la instancia

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

<your-topic>

Nombre del topic creado en la consola

DelayTopic

Nota

Si es nuevo en ApsaraMQ for RocketMQ, consulte Demo project para configurar un proyecto funcional antes de enviar y recibir mensajes.

Suscripción a mensajes diferidos

La suscripción a mensajes diferidos funciona igual que la suscripción a mensajes normales. No se requiere ninguna configuración especial en el consumidor, ya que la lógica de demora reside por completo en el lado del productor.

Para ver el código de ejemplo del consumidor, consulte Subscribe to messages.

Siguientes pasos