NMS.ActiveMQ 延迟和计划消息功能
从版本 **5.4** 开始,ActiveMQ 在 ActiveMQ 消息代理中内置了一个可选的持久调度程序。通过在 xml 配置 中将代理的 **schedulerSupport** 属性设置为 true 来启用它。
ActiveMQ 客户端可以通过使用以下消息属性来利用延迟传递
属性名称 | 类型 | 描述 |
---|---|---|
AMQ_SCHEDULED_DELAY |
long | 消息在被代理安排传递之前等待的时间(以毫秒为单位) |
AMQ_SCHEDULED_PERIOD |
long | 从开始时间到再次安排消息之前等待的时间(以毫秒为单位) |
AMQ_SCHEDULED_REPEAT |
int | 重复安排消息传递的次数 |
AMQ_SCHEDULED_CRON |
String | 使用 Cron 条目设置时间表 |
例如,要将消息安排在 60 秒后传递,您需要设置 AMQ_SCHEDULED_DELAY 属性
IMessageProducer producer = session.CreateProducer(destination);
ITextMessage message = session.CreateTextMessage("test msg");
long time = 60 * 1000;
message.Properties\["AMQ\_SCHEDULED\_DELAY"\] = time;
producer.Send(message);
您可以设置消息等待一个初始延迟,并重复传递 10 次,每次重新传递之间等待 10 秒
IMessageProducer producer = session.CreateProducer(destination);
ITextMessage message = session.CreateTextMessage("test msg");
long delay = 30 * 1000;
long period = 10 * 1000;
int repeat = 9;
message.Properties\["AMQ\_SCHEDULED\_DELAY"\] = delay;
message.Properties\["AMQ\_SCHEDULED\_PERIOD"\] = period;
message.Properties\["AMQ\_SCHEDULED\_REPEAT"\] = repeat;
producer.Send(message);
您也可以使用 CRON 来安排消息,例如,如果您想将消息安排为每小时传递一次,您需要将 CRON 条目设置为 - 0 * * * * - 例如
IMessageProducer producer = session.CreateProducer(destination);
ITextMessage message = session.CreateTextMessage("test msg");
message.Properties\["AMQ\_SCHEDULED\_CRON"\] = "0 * * * *";
producer.Send(message);
CRON 计划优先于使用消息延迟 - 但是,如果使用 CRON 条目设置了重复和周期,ActiveMQ 调度程序将在每次 CRON 条目触发时安排消息的传递。更容易用一个例子来解释。假设您想让消息传递 10 次,每次消息之间延迟一秒 - 并且您希望每小时发生一次 - 您将这样做
IMessageProducer producer = session.CreateProducer(destination);
ITextMessage message = session.CreateTextMessage("test msg");
message.Properties\["AMQ\_SCHEDULED\_CRON"\] = "0 * * * *";
message.Properties\["AMQ\_SCHEDULED\_DELAY"\] = 1000;
message.Properties\["AMQ\_SCHEDULED\_PERIOD"\] = 1000;
message.Properties\["AMQ\_SCHEDULED\_REPEAT"\] = 9;
producer.Send(message);