Todos os produtos
Search
Central de documentação

ApsaraMQ for RocketMQ:Send and receive scheduled messages

Última atualização: Jun 27, 2026

Mensagens agendadas são entregues aos consumidores em um timestamp específico, não imediatamente. Use-as em cenários que exigem uma janela de tempo entre a produção e o consumo da mensagem ou quando tarefas agendadas são acionadas por mensagens — por exemplo, cancelar um pedido não pago após 30 minutos ou disparar uma tarefa periódica de limpeza.

O código de exemplo .NET abaixo demonstra como enviar mensagens agendadas com o SDK cliente TCP. Para entender as diferenças entre mensagens agendadas e atrasadas, consulte Mensagens agendadas e mensagens atrasadas.

Regiões suportadas

As mensagens agendadas estão disponíveis nas seguintes regiões:

  • Internet

  • China (Hangzhou)

  • China (Beijing)

  • China (Shanghai)

  • China (Shenzhen)

Como funciona

  1. O produtor chama setStartDeliverTime para definir um timestamp de entrega na mensagem.

  2. O broker retém a mensagem até o timestamp especificado.

  3. No momento da entrega, a mensagem fica disponível para os consumidores.

O horário de entrega é um timestamp Unix em milissegundos (tempo absoluto, não um atraso relativo).

Pré-requisitos

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

Enviar uma mensagem agendada

O exemplo a seguir envia uma mensagem com entrega agendada para 3 segundos a partir do momento atual. Para mais exemplos, consulte o repositório de códigos do ApsaraMQ for RocketMQ.

Substitua os placeholders antes de executar o código:

Placeholder

Descrição

Onde encontrar

<your-group-id>

ID do grupo de consumidores

Console do ApsaraMQ for RocketMQ

<your-tcp-endpoint>

Endpoint TCP

Página Instance Details, seção TCP Endpoint

<your-topic>

Nome do tópico

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

        }
    }
}

Inscrever-se em mensagens agendadas

Mensagens agendadas não exigem configuração especial no consumidor. Após o horário de entrega, a mensagem aparece no tópico como qualquer outra. Use o mesmo código de consumidor das mensagens normais.

Para ver códigos de exemplo, consulte Inscrever-se em mensagens.

Observações de uso