This document primarily describes the concepts and usage of scheduled messages and delayed messages in TDMQ for RocketMQ.
Concepts
Scheduled message: In actual business, after a message is sent to the server, the consumer is expected to receive it at a later time point rather than immediately. This type of message is called scheduled message.
Delayed message: In actual business, after a message is sent to the server, the consumer is expected to receive it after a period of time rather than immediately. This type of message is called delayed message.
Actually, the delayed message can be regarded as a special type of scheduled message, which is essentially the same thing.
Instructions
Apache RocketMQ does not provide an API for you to freely set the delay time. In order to ensure compatibility with the open-source RocketMQ client, TDMQ for RocketMQ has designed a method to specify the message sending time by adding the property key-value pair to the message. You only need to add the __STARTDELIVERTIME
property value to the property
of the message that needs to be sent at a scheduled time (within 40 days). For delayed messages, you can first calculate the time point for scheduled sending and then send them as scheduled messages.
Scheduled Messages
To send a scheduled message, simply write a standard millisecond timestamp to the __STARTDELIVERTIME
property before sending it.
Message msg = new Message("test-topic", ("message content").getBytes(StandardCharsets.UTF_8));
try {
long timeStamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2021-10-01 00:00:00").getTime();
msg.putUserProperty("__STARTDELIVERTIME", String.valueOf(timeStamp));
SendResult result = producer.send(msg);
System.out.println("Send delay message: " + result);
} catch (ParseException e) {
Delayed Messages
For a delayed message, its scheduled sending time point is first calculated by System.currentTimeMillis() + delayTime
, and then it is sent as a scheduled message.
Message msg = new Message("test-topic", ("message content").getBytes(StandardCharsets.UTF_8));
long delayTime = System.currentTimeMillis() + 10000;
msg.putUserProperty("__STARTDELIVERTIME", String.valueOf(delayTime));
SendResult result = producer.send(msg);
System.out.println("Send delay message: " + result);
Use Restrictions
When using delayed messages, make sure that the time on the client is in sync with the time on the server (UTC+8 Beijing time in all regions). Otherwise, there will be a time difference.
There is a precision deviation of about one second for scheduled and delayed messages.
The time ranges of scheduled and delayed messages varies based on different cluster specifications. For details, see Product Series. When using scheduled messages, you need to set a time point after the current time. Otherwise, the message will be sent to the consumer immediately.
Was this page helpful?