ActiveMQ延遲和定時投遞
AMQ的延遲和定時投遞用起來非常的簡單,可根據產品的需要在訊息生產時新增必要的屬性,即可達到目的。前提是已經為Broker添加了“排程支援”。
來自官方的說明:
http://activemq.apache.org/delay-and-schedule-message-delivery.html
ActiveMQ from version 5.4 has an optional persistent scheduler built into the ActiveMQ message broker. It is enabled by setting the broker schedulerSupport
An ActiveMQ client can take advantage of a delayed delivery by using the following message properties:
Property name |
type |
description |
---|---|---|
AMQ_SCHEDULED_DELAY |
long |
The time in milliseconds that a message will wait before being scheduled to be delivered by the broker |
AMQ_SCHEDULED_PERIOD |
long |
The time in milliseconds to wait after the start time to wait before scheduling the message again |
AMQ_SCHEDULED_REPEAT |
int |
The number of times to repeat scheduling a message for delivery |
AMQ_SCHEDULED_CRON |
String |
Use a Cron entry to set the schedule |
For the connivence of Java JMS clients - there's an interface with the property names used for scheduling at org.apache.activemq.ScheduledMessage.
For example, to have a message scheduled for delivery in 60 seconds - you would need to set the
AMQ_SCHEDULED_DELAY
property:
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long
time = 60 *
1000 ;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, time);
producer.send(message);
|
You can set a message to wait with an initial delay, and the repeat delivery 10 times, waiting 10 seconds between each re-delivery:
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
long
delay = 30 *
1000 ;
long
period = 10 *
1000 ;
int
repeat = 9 ;
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD, period);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, repeat);
producer.send(message);
|
You can also use CRON to schedule a message, for example, if you want a message scheduled to be delivered every hour, you would need to set the CRON entry to be - 0 * * * * - e.g.
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, " 0
* * * *");
producer.send(message);
|
CRON scheduling takes priority over using message delay - however, if a repeat and period is set with a CRON entry, the ActiveMQ scheduler will schedule delivery of the message for every time the CRON entry fires. Easier to explain with an example. Supposing that you want a message to be delivered 10 times, with a one second delay between each message - and you wanted this to happen every hour - you'd do this:
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "
0
* * * *");
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY,
1000
);
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_PERIOD,
1000
);
message.setIntProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT,
9
);
producer.send(message)