延迟和计划消息传递
从版本 **5.4** 开始,ActiveMQ Classic 具有可选的持久调度程序,该调度程序内置于 ActiveMQ Classic 消息代理中。通过在 Xml 配置 中将代理 **schedulerSupport** 属性设置为 true 来启用它。ActiveMQ Classic 客户端可以使用以下消息属性来利用延迟传递。
检查您的消息属性
消息属性
scheduledJobId
专供作业调度程序使用。如果在发送之前设置了此属性,则消息将立即发送,不会被调度。此外,在收到计划消息后,属性scheduledJobId
将在收到的消息上设置,因此在使用类似于 Camel Route 的东西时请记住这一点,Camel Route 可能在重新发送消息时自动复制属性。
属性名称 | 类型 | 描述 |
---|---|---|
AMQ_SCHEDULED_DELAY | long | 消息等待被代理调度传递的时间(毫秒) |
AMQ_SCHEDULED_PERIOD | long | 消息从开始时间开始等待再次调度的时间(毫秒) |
AMQ_SCHEDULED_REPEAT | int | 重复调度消息以进行传递的次数 |
AMQ_SCHEDULED_CRON | String | 使用 Cron 条目来设置调度 |
为了 Java JMS 客户端的便利,有一个带有用于调度的属性名称的接口,位于 org.apache.activemq.ScheduledMessage。
例如,要将消息安排在 60 秒后传递,您需要设置 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 次,每次重新传递之间等待 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 Classic 调度程序将在 CRON 条目每次触发时安排消息的传递。用一个例子更容易解释。假设您希望将消息传递 10 次,每次消息之间延迟一秒,并且您希望每小时发生一次 - 您将这样做
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);