简介

从ActiveMQ5.4开始,内置了一个可选的持久性调度程序。在activemq.xml中设置broker的schedulerSupport=true来启用。

1
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="amq1" dataDirectory="${activemq.data}" schedulerSupport="true">

JMS客户端可以使用下面的属性之一来实现消息的延迟投递:

属性名 类型 描述
AMQ_SCHEDULED_DELAY long broker在投递消息前等待的时间(单位毫秒)
AMQ_SCHEDULED_PERIOD long 消息重复投递的间隔(单位毫秒)
AMQ_SCHEDULED_REPEAT int 重复投递消息的次数
AMQ_SCHEDULED_CRON String 使用Cron表达式

ActiveMQ也提供了一个封装的消息类型:org.apache.activemq.ScheduledMessage,可以使用这个类来辅助设置。

例如,要让消息在60后投递,你需要设置AMQ_SCHEDULED_DELAY属性:

1
2
3
4
5
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次,每次重新投递等待10秒:

1
2
3
4
5
6
7
8
9
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);

如上,在30秒后开始投递消息,总共投递10次,两次消息投递间隔为10秒。

你还可以使用CRON表达式。比如,如果你希望每小时投递1条消息,可以将CRON设置为0 * * * *

1
2
3
4
MessageProducer producer = session.createProducer(destination);
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
producer.send(message);

CRON表达式的优先级高于另外的几个参数,如果在设置了CRON的同时,也有repeat和period参数,则会在每次CRON执行时,重复投递repeat次,每次的间隔为period。

比如每小时投递10次消息,延迟1秒后开始,每次间隔1秒:

1
2
3
4
5
6
7
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);

参考:http://activemq.apache.org/delay-and-schedule-message-delivery.html