As mensagens agendadas são entregues aos consumidores apenas após um timestamp especificado, e não imediatamente. Este tópico demonstra como enviar e assinar mensagens agendadas com o SDK de cliente TCP para C/C++.
Casos de uso comuns de mensagens agendadas:
Execução de tarefas atrasadas: cancele um pedido não pago após 30 minutos ou acionar um trabalho de limpeza periódica em um horário específico.
Processamento com janela de tempo: introduzir um atraso controlado entre a produção e o consumo da mensagem — por exemplo, enviar uma notificação de lembrete 24 horas após o registro do usuário.
Para entender as diferenças entre mensagens agendadas e atrasadas, consulte Mensagens agendadas e mensagens atrasadas.
Pré-requisitos
Antes de começar, verifique se você tem:
O SDK para C/C++ baixado e instalado.
Um ambiente de desenvolvimento configurado conforme descrito em Preparação do ambiente (V1.x.x).
Uma instância do ApsaraMQ for RocketMQ com os recursos necessários (instância, tópico e grupo de consumidores).
Um par de AccessKey para sua conta Alibaba Cloud.
Enviar mensagens agendadas
O exemplo a seguir envia uma mensagem agendada com atraso de entrega de 3 segundos. O método setStartDeliverTime aceita um timestamp absoluto em milissegundos. O broker retém a mensagem até esse momento e depois a entrega aos consumidores.
#include "ONSFactory.h"
#include "ONSClientException.h"
#include <windows.h>
using namespace ons;
int main()
{
// Create the producer and set the required properties.
ONSFactoryProperty factoryInfo;
// The ID of the consumer group that you created in the ApsaraMQ for RocketMQ console.
factoryInfo.setFactoryProperty(ONSFactoryProperty::ProducerId, "XXX");
// The TCP endpoint. Find this in the TCP Endpoint section of the Instance Details page in the ApsaraMQ for RocketMQ console.
factoryInfo.setFactoryProperty(ONSFactoryProperty::NAMESRV_ADDR, "XXX");
// The topic that you created in the ApsaraMQ for RocketMQ console.
factoryInfo.setFactoryProperty(ONSFactoryProperty::PublishTopics,"XXX" );
// The message content.
factoryInfo.setFactoryProperty(ONSFactoryProperty::MsgContent, "XXX");
// Make sure the environment variables ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET are set.
// AccessKey ID for authentication.
factoryInfo.setFactoryProperty(ONSFactoryProperty::AccessKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
// AccessKey secret for authentication.
factoryInfo.setFactoryProperty(ONSFactoryProperty::SecretKey, getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// Create the producer.
Producer *pProducer = ONSFactory::getInstance()->createProducer(factoryInfo);
// Call start() once before sending messages.
pProducer->start();
Message msg(
// Message topic.
factoryInfo.getPublishTopics(),
// Message tag, used by consumers to filter messages on the broker.
"TagA",
// Message body. Must not be empty. The producer and consumer must agree on the serialization and deserialization methods.
factoryInfo.getMessageContent()
);
// The message key is a business-specific identifier. Keep it globally unique
// so you can query the message by key in the ApsaraMQ for RocketMQ console.
// Setting a key is optional.
msg.setKey("ORDERID_100");
// Set the delivery time as an absolute timestamp in milliseconds.
// The broker delivers the message to consumers only after this time.
// In this example, the message is delivered 3 seconds from now.
long deliverTime = GetTickCount64() + 3000;
msg.setStartDeliverTime(deliverTime);
// Send the message. If no exception is thrown, the send succeeded.
try
{
SendResultONS sendResult = pProducer->send(msg);
}
catch(ONSClientException & e)
{
// Handle the exception.
}
// Shut down the producer before exiting to avoid memory leaks.
pProducer->shutdown();
return 0;
}
Substitua os espaços reservados XXX pelos valores reais:
|
Espaço reservado |
Descrição |
Onde encontrar |
|
|
ID do grupo de consumidores |
ApsaraMQ for RocketMQ console > sua instância > Consumer Groups |
|
|
Endpoint TCP |
ApsaraMQ for RocketMQ console > Instance Details > TCP Endpoint |
|
|
Nome do tópico |
ApsaraMQ for RocketMQ console > sua instância > Topics |
|
|
Conteúdo do corpo da mensagem |
Definido pela sua aplicação |
Para obter detalhes sobre regras de formato de hora e limites do método setStartDeliverTime, consulte Mensagens agendadas e mensagens atrasadas.
Assinar mensagens agendadas
A assinatura de mensagens agendadas funciona exatamente como a de mensagens normais. Não é necessária nenhuma configuração adicional no lado do consumidor.
Para ver o código completo de assinatura, consulte Assinar mensagens.