Todos los productos
Search
Centro de documentos

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

Última actualización: Sep 04, 2026

Los mensajes programados se entregan a los consumidores en una marca de tiempo específica en lugar de hacerlo de inmediato. Utilícelos en escenarios donde se requiere un intervalo de tiempo entre la producción y el consumo del mensaje, o bien cuando los mensajes desencadenan tareas programadas; por ejemplo, para cancelar un pedido no pagado después de 30 minutos o activar una tarea periódica de limpieza.

El siguiente código de ejemplo en .NET muestra cómo enviar mensajes programados con el SDK de cliente TCP. Para obtener más información sobre las diferencias entre mensajes programados y diferidos, consulte Scheduled messages and delayed messages.

Regiones compatibles

Los mensajes programados están disponibles en las siguientes regiones:

  • Internet

  • China (Hangzhou)

  • China (Beijing)

  • China (Shanghai)

  • China (Shenzhen)

Funcionamiento

  1. El productor invoca setStartDeliverTime para establecer una marca de tiempo de entrega en el mensaje.

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

  3. Al llegar la hora de entrega, el mensaje queda disponible para los consumidores.

La hora de entrega es una marca de tiempo Unix en milisegundos (tiempo absoluto, no un retraso relativo).

Requisitos previos

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

Envío de un mensaje programado

El siguiente ejemplo envía un mensaje programado para entregarse 3 segundos después del momento actual. Para consultar más ejemplos, visite el repositorio de código de ApsaraMQ for RocketMQ.

Reemplace los marcadores de posición antes de ejecutar el código:

Marcador de posición

Descripción

Ubicación

<your-group-id>

ID del grupo de consumidores

Consola de ApsaraMQ for RocketMQ

<your-tcp-endpoint>

Endpoint TCP

Página Instance Details, sección TCP Endpoint

<your-topic>

Nombre del tema

Consola de ApsaraMQ for RocketMQ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using ons;

namespace ons
{
    class onscsharp
    {
        private static readonly DateTime Jan1st1970 = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

        public static long CurrentTimeMillis()
        {
           return (long) (DateTime.UtcNow - Jan1st1970).TotalMilliseconds;
        }

        static void Main(string[] args)
        {
            // Configure the producer.
            ONSFactoryProperty factoryInfo = new ONSFactoryProperty();
            // Consumer group ID created in the ApsaraMQ for RocketMQ console.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.ProducerId, "<your-group-id>");
            // TCP endpoint from the Instance Details page.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.NAMESRV_ADDR, "<your-tcp-endpoint>");
            // Topic created in the ApsaraMQ for RocketMQ console.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.PublishTopics, "<your-topic>");
            // Message content.
            factoryInfo.setFactoryProperty(ONSFactoryProperty.MsgContent, "scheduled_msg_body");
            // Load AccessKey credentials from environment variables.
            // Make sure ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
            factoryInfo.setFactoryProperty(ONSFactoryProperty::AccessKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
            factoryInfo.setFactoryProperty(ONSFactoryProperty::SecretKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));

            // Create and start the producer. Call start() only once before sending messages.
            Producer pProducer = ONSFactory.getInstance().createProducer(factoryInfo);
            pProducer.start();

            Message msg = new Message(
                factoryInfo.getPublishTopics(),  // Topic
                "TagA",                          // Message tag for filtering
                factoryInfo.getMessageContent()  // Message body
            );

            // Set a business key for message tracing in the console.
            // Optional -- messages send and receive correctly without a key.
            msg.setKey("ORDERID_100");

            // Set the delivery time to 3 seconds from now (millisecond Unix timestamp).
            long deliverTime = CurrentTimeMillis() + 3000;
            msg.setStartDeliverTime(deliverTime);

            // Send the message. A successful call returns a SendResultONS object.
            try
            {
                SendResultONS sendResult = pProducer.send(msg);
            }
            catch(ONSClientException e)
            {
                // Handle send failures (network issues, invalid parameters, etc.).
            }

            // Shut down the producer before exiting to avoid memory leaks.
            pProducer.shutdown();

        }
    }
}

Suscripción a mensajes programados

Los mensajes programados no requieren ninguna configuración especial en el consumidor. Una vez que llega la hora de entrega, el mensaje aparece en el tema como cualquier otro. Utilice el mismo código de consumidor que emplea para los mensajes normales.

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

Notas de uso