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
El productor invoca
setStartDeliverTimepara establecer una marca de tiempo de entrega en el mensaje.El broker retiene el mensaje hasta que se cumple la marca de tiempo especificada.
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:
El SDK de .NET descargado e instalado
Una instancia, un tema y un grupo de consumidores de ApsaraMQ for RocketMQ creados en la consola
Un par de AccessKey para su cuenta de Alibaba Cloud
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 |
|
|
ID del grupo de consumidores |
Consola de ApsaraMQ for RocketMQ |
|
|
Endpoint TCP |
Página Instance Details, sección TCP Endpoint |
|
|
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
Para obtener información sobre los términos utilizados en los mensajes programados y las precauciones que debe tomar al usarlos, consulte Scheduled messages and delayed messages.