Algunos escenarios empresariales requieren que los mensajes se entreguen en un momento futuro específico en lugar de hacerlo de inmediato. Por ejemplo, una plataforma de comercio electrónico necesita cancelar pedidos no pagados después de 30 minutos, o un sistema de monitoreo debe activar comprobaciones de estado periódicas. Los mensajes programados en ApsaraMQ for RocketMQ permiten establecer una marca de tiempo de entrega en cada mensaje para que el broker lo retenga y lo entregue a los consumidores en el momento especificado.
Este tema proporciona código de ejemplo para enviar y recibir mensajes programados mediante el SDK de cliente TCP para Java.
Para consultar la terminología y las restricciones, consulte Scheduled messages and delayed messages.
Si es nuevo en ApsaraMQ for RocketMQ, consulte el Demo project para configurar un proyecto funcional antes de implementar mensajes programados.
Casos de uso
Gestión de tiempos de espera en pedidos: Envíe un mensaje programado con la fecha límite de pago cuando un usuario realice un pedido. Si el pedido sigue sin pagarse al momento de la entrega del mensaje, el sistema lo cancela automáticamente.
Activación de tareas periódicas: Programe operaciones como la limpieza diaria de archivos o la sincronización periódica de datos mediante el envío de mensajes con tiempos de entrega futuros.
Funcionamiento de los mensajes programados
El productor establece una marca de tiempo de entrega futura en un mensaje al llamar a
msg.setStartDeliverTime(timestamp).El broker retiene el mensaje hasta que se cumple la marca de tiempo especificada.
En el momento programado, el broker entrega el mensaje a los consumidores suscritos.
Reglas para establecer el tiempo:
|
Regla |
Comportamiento |
|
Formato de marca de tiempo |
Marca de tiempo Unix en milisegundos. Convierta la hora de entrega deseada a milisegundos desde la época (epoch). |
|
Marca de tiempo pasada |
El mensaje se entrega de inmediato. |
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
El SDK para Java instalado. Consulte Prepare the environment
Una instancia, un tema y un grupo de consumidores de ApsaraMQ for RocketMQ creados en la ApsaraMQ for RocketMQ console
Un AccessKey pair para su cuenta de Alibaba Cloud
(Opcional) Logging settings configurado
Envío de un mensaje programado
A continuación, se muestra un ejemplo que envía un mensaje con una marca de tiempo de entrega futura. El método msg.setStartDeliverTime(timestamp) indica al broker cuándo entregar el mensaje.
Reemplace los marcadores de posición con sus valores reales:
|
Marcador de posición |
Descripción |
Ejemplo |
|
|
Nombre del tema de destino |
my-scheduled-topic |
|
|
Etiqueta del mensaje para filtrado por parte del consumidor |
payment-timeout |
|
|
Contenido del mensaje como matriz de bytes |
|
|
|
Identificador único específico del negocio |
ORDERID_100 |
|
|
Endpoint TCP obtenido de la página Instance Details en la consola de ApsaraMQ for RocketMQ |
-- |
import com.aliyun.openservices.ons.api.Message;
import com.aliyun.openservices.ons.api.ONSFactory;
import com.aliyun.openservices.ons.api.Producer;
import com.aliyun.openservices.ons.api.PropertyKeyConst;
import com.aliyun.openservices.ons.api.SendResult;
import java.text.SimpleDateFormat;
import java.util.Properties;
public class ProducerDelayTest {
public static void main(String[] args) {
Properties properties = new Properties();
// Load AccessKey pair from environment variables
properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
// TCP endpoint from the Instance Details page in the ApsaraMQ for RocketMQ console
properties.put(PropertyKeyConst.NAMESRV_ADDR, "<your-tcp-endpoint>");
Producer producer = ONSFactory.createProducer(properties);
// Call start() once before sending any messages
producer.start();
Message msg = new Message(
"<your-topic>", // Topic
"<your-tag>", // Tag for consumer-side filtering
"<your-message-body>".getBytes() // Message body in bytes
);
// Optional: set a business key for message tracing in the console
msg.setKey("<your-message-key>");
try {
// Set the delivery timestamp (milliseconds since epoch)
// Example: deliver at 2026-03-15 10:30:00
long deliverTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
.parse("2026-03-15 10:30:00")
.getTime();
msg.setStartDeliverTime(deliverTime);
SendResult sendResult = producer.send(msg);
System.out.println("Message Id:" + sendResult.getMessageId());
} catch (Exception e) {
// Handle send failure: retry or persist the message
System.out.println("Send failed. Topic: " + msg.getTopic());
e.printStackTrace();
}
// Shut down the producer when the application exits.
// To send messages frequently, keep the producer running instead of
// shutting it down after each send.
producer.shutdown();
}
}
Puntos clave:
setStartDeliverTime(long timestamp)acepta una marca de tiempo Unix en milisegundos. El broker retiene el mensaje hasta ese momento.Llame a
producer.start()una sola vez antes de enviar mensajes. En escenarios de alto throughput, reutilice la misma instancia del productor en lugar de crear una nueva para cada mensaje.msg.setKey()es opcional, pero se recomienda para rastrear mensajes por ID de negocio en la consola de ApsaraMQ for RocketMQ.
Para más ejemplos, consulte la ApsaraMQ for RocketMQ code library.
Suscripción a mensajes programados
Suscríbase a los mensajes programados de la misma manera que a los mensajes normales. No se requiere ninguna lógica especial de suscripción; el broker entrega el mensaje a los consumidores cuando llega la marca de tiempo programada.
Para consultar el código de suscripción, consulte Subscribe to messages.
Mejores prácticas
Establezca claves de mensaje únicas. La clave del mensaje (
setKey) debe ser globalmente única siempre que sea posible. Utilícela para buscar mensajes en la consola de ApsaraMQ for RocketMQ si ocurren problemas de entrega.Reutilice la instancia del productor. Llame a
producer.shutdown()únicamente cuando la aplicación finalice. Crear y destruir productores repetidamente desperdicia memoria.
Temas relacionados
Scheduled messages and delayed messages -- Mecanismo de programación y restricciones
Subscribe to messages -- Configuración del consumo de mensajes
ApsaraMQ for RocketMQ code library -- Más ejemplos del SDK de Java
Demo project -- Proyecto funcional completo