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
O produtor chama
setStartDeliverTimepara definir um timestamp de entrega na mensagem.O broker retém a mensagem até o timestamp especificado.
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:
O SDK .NET baixado e instalado
Uma instância, um tópico e um grupo de consumidores do ApsaraMQ for RocketMQ criados no console
Um par de AccessKey para sua conta Alibaba Cloud
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 |
|
|
ID do grupo de consumidores |
Console do ApsaraMQ for RocketMQ |
|
|
Endpoint TCP |
Página Instance Details, seção TCP Endpoint |
|
|
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
Para obter informações sobre os termos usados em mensagens agendadas e as precauções necessárias ao utilizá-las, consulte Mensagens agendadas e mensagens atrasadas.