Todos los productos
Search
Centro de documentos

ApsaraMQ for RocketMQ:Envío y recepción de mensajes programados

Última actualización: Sep 04, 2026

Algunos escenarios empresariales requieren que los mensajes se entreguen en un momento futuro específico en lugar de hacerlo de inmediato. Por ejemplo, una plataforma de comercio electrónico necesita cancelar pedidos no pagados después de 30 minutos, o un sistema de monitoreo debe activar comprobaciones de estado periódicas. Los mensajes programados en ApsaraMQ for RocketMQ permiten establecer una marca de tiempo de entrega en cada mensaje para que el broker lo retenga y lo entregue a los consumidores en el momento especificado.

Este tema proporciona código de ejemplo para enviar y recibir mensajes programados mediante el SDK de cliente TCP para Java.

Para consultar la terminología y las restricciones, consulte Scheduled messages and delayed messages.

Nota

Si es nuevo en ApsaraMQ for RocketMQ, consulte el Demo project para configurar un proyecto funcional antes de implementar mensajes programados.

Casos de uso

  • Gestión de tiempos de espera en pedidos: Envíe un mensaje programado con la fecha límite de pago cuando un usuario realice un pedido. Si el pedido sigue sin pagarse al momento de la entrega del mensaje, el sistema lo cancela automáticamente.

  • Activación de tareas periódicas: Programe operaciones como la limpieza diaria de archivos o la sincronización periódica de datos mediante el envío de mensajes con tiempos de entrega futuros.

Funcionamiento de los mensajes programados

  1. El productor establece una marca de tiempo de entrega futura en un mensaje al llamar a msg.setStartDeliverTime(timestamp).

  2. El broker retiene el mensaje hasta que se cumple la marca de tiempo especificada.

  3. En el momento programado, el broker entrega el mensaje a los consumidores suscritos.

Reglas para establecer el tiempo:

Regla

Comportamiento

Formato de marca de tiempo

Marca de tiempo Unix en milisegundos. Convierta la hora de entrega deseada a milisegundos desde la época (epoch).

Marca de tiempo pasada

El mensaje se entrega de inmediato.

Requisitos previos

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

Envío de un mensaje programado

A continuación, se muestra un ejemplo que envía un mensaje con una marca de tiempo de entrega futura. El método msg.setStartDeliverTime(timestamp) indica al broker cuándo entregar el mensaje.

Reemplace los marcadores de posición con sus valores reales:

Marcador de posición

Descripción

Ejemplo

<your-topic>

Nombre del tema de destino

my-scheduled-topic

<your-tag>

Etiqueta del mensaje para filtrado por parte del consumidor

payment-timeout

<your-message-body>

Contenido del mensaje como matriz de bytes

"Hello MQ".getBytes()

<your-message-key>

Identificador único específico del negocio

ORDERID_100

<your-tcp-endpoint>

Endpoint TCP obtenido de la página Instance Details en la consola 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.text.SimpleDateFormat;
import java.util.Properties;

public class ProducerDelayTest {
    public static void main(String[] args) {
        Properties properties = new Properties();
        // Load AccessKey pair 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"));
        // TCP endpoint from 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
                "<your-tag>",              // Tag for consumer-side filtering
                "<your-message-body>".getBytes()  // Message body in bytes
        );

        // Optional: set a business key for message tracing in the console
        msg.setKey("<your-message-key>");

        try {
            // Set the delivery timestamp (milliseconds since epoch)
            // Example: deliver at 2026-03-15 10:30:00
            long deliverTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
                    .parse("2026-03-15 10:30:00")
                    .getTime();
            msg.setStartDeliverTime(deliverTime);

            SendResult sendResult = producer.send(msg);
            System.out.println("Message Id:" + sendResult.getMessageId());
        } catch (Exception e) {
            // Handle send failure: retry or persist the message
            System.out.println("Send failed. Topic: " + msg.getTopic());
            e.printStackTrace();
        }

        // Shut down the producer when the application exits.
        // To send messages frequently, keep the producer running instead of
        // shutting it down after each send.
        producer.shutdown();
    }
}

Puntos clave:

  • setStartDeliverTime(long timestamp) acepta una marca de tiempo Unix en milisegundos. El broker retiene el mensaje hasta ese momento.

  • Llame a producer.start() una sola vez antes de enviar mensajes. En escenarios de alto throughput, reutilice la misma instancia del productor en lugar de crear una nueva para cada mensaje.

  • msg.setKey() es opcional, pero se recomienda para rastrear mensajes por ID de negocio en la consola de ApsaraMQ for RocketMQ.

Para más ejemplos, consulte la ApsaraMQ for RocketMQ code library.

Suscripción a mensajes programados

Suscríbase a los mensajes programados de la misma manera que a los mensajes normales. No se requiere ninguna lógica especial de suscripción; el broker entrega el mensaje a los consumidores cuando llega la marca de tiempo programada.

Para consultar el código de suscripción, consulte Subscribe to messages.

Mejores prácticas

  • Establezca claves de mensaje únicas. La clave del mensaje (setKey) debe ser globalmente única siempre que sea posible. Utilícela para buscar mensajes en la consola de ApsaraMQ for RocketMQ si ocurren problemas de entrega.

  • Reutilice la instancia del productor. Llame a producer.shutdown() únicamente cuando la aplicación finalice. Crear y destruir productores repetidamente desperdicia memoria.

Temas relacionados