延迟和计划消息传递

从版本 **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);

Apache、ActiveMQ、Apache ActiveMQ、Apache 羽毛徽标和 Apache ActiveMQ 项目徽标是 Apache 软件基金会的商标。版权所有 © 2024,Apache 软件基金会。根据 Apache 许可证 2.0 获得许可。