Los mensajes programados se entregan a los consumidores únicamente después de una marca de tiempo específica, en lugar de hacerlo de inmediato. Este tema explica cómo enviar y suscribirse a mensajes programados mediante el SDK de cliente TCP para C/C++.
Dos casos de uso comunes de los mensajes programados:
Ejecución diferida de tareas: cancele un pedido no pagado después de 30 minutos o active un trabajo de limpieza periódica a una hora determinada.
Procesamiento por ventana de tiempo: introduzca un retraso controlado entre la producción y el consumo de mensajes; por ejemplo, envíe una notificación de recordatorio 24 horas después del registro de un usuario.
Para obtener contexto sobre las diferencias entre los mensajes programados y los mensajes con retraso, consulte Scheduled messages and delayed messages.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
El SDK for C/C++ descargado e instalado.
Un entorno de desarrollo configurado según Environment preparation (V1.x.x).
Una instancia de ApsaraMQ for RocketMQ con los recursos necesarios (instancia, tema y grupo de consumidores).
Un par de AccessKey para su cuenta de Alibaba Cloud.
Envío de mensajes programados
A continuación, se muestra un ejemplo que envía un mensaje programado con un retraso de entrega de 3 segundos. El método setStartDeliverTime acepta una marca de tiempo absoluta en milisegundos. El broker retiene el mensaje hasta que se alcanza dicha marca de tiempo y luego lo entrega a los 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;
}
Reemplace los marcadores de posición XXX con sus valores reales:
|
Marcador de posición |
Descripción |
Dónde encontrarlo |
|
|
ID del grupo de consumidores |
ApsaraMQ for RocketMQ console > su instancia > Consumer Groups |
|
|
Endpoint TCP |
ApsaraMQ for RocketMQ console > Instance Details > TCP Endpoint |
|
|
Nombre del tema |
ApsaraMQ for RocketMQ console > su instancia > Topics |
|
|
Contenido del cuerpo del mensaje |
Definido por su aplicación |
Para obtener detalles sobre las reglas de formato de tiempo y los límites de setStartDeliverTime, consulte Scheduled messages and delayed messages.
Suscripción a mensajes programados
La suscripción a mensajes programados funciona igual que la suscripción a mensajes normales. No se requiere configuración adicional en el lado del consumidor.
Para consultar el código completo de suscripción, véase Subscribe to messages.