原文地址
http://activemq.apache.org/delay-and-schedule-message-delivery
ActiveMQ从5.4版本开始支持一个可选择的持久化调度器(scheduler)在ActiveMQ的消息broker中。在XML Configuration中通过设置broker的schedulerSupport属性为true来开启此功能。一个ActiveMQ客户端能够利用延迟推送通过下面的消息属性:
检查你的消息属性
消息属性scheduledJobId被保留给工作调度(Job Scheduler)使用。如果在发送前设置了此属性,这个消息将被立即发送,而不是定时发送。另外,定时消息被接收之后,scheduledJobId属性将被设置在被接收的消息上,因此请记住如果使用像Camel Route 之类的东西,当重新发送该消息的时候可能会自动复制属性
属性名称 | 类型 | 描述 |
---|---|---|
AMQ_SCHEDULED_DELAY | long | 在broker将消息投递之前,消息等待的时长(单位为毫秒) |
AMQ_SCHEDULED_PERIOD | long | 在重新调度消息之前,消息的等待时长(单位为毫秒) |
AMQ_SCHEDULED_REPEAT | int | 重复调度消息的投递次数 |
AMQ_SCHEDULED_CRON | String | 可以使用Cron表达式设置调度 |
为了方便Java Jms客户端-接口***org.apache.activemq.ScheduledMessage***上有用于调度的属性名称
例如,有一个消息被延迟60s调度–你需要设置AMQ_SCHEDULED_DELAY 属性
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);
你可以设置消息等待设置一个初始延迟,和重复投递十次,每次重新投递之前等待10秒钟
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);
你可以使用CRON表达式去设置调度消息,例如,你想将一个消息每隔一个小时投递一次,你需要将CRON条目设置为- 0 * * * *
例如:
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
producer.send(message);
CRON调度优先于使用消息延迟-然而如果CRON条目设置重复次数和周期,则ActiveMQ调度器将在每次CRON条目触发时安排投递消息。用一个例子更容易解释,假设你想让一个消息投递10次,伴随着每条消息之前有1秒的延迟,并且你想每小时发生一次-你可以这样做
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);