延遲與排程訊息傳遞

5.4 版本開始,ActiveMQ Classic 在 ActiveMQ Classic 訊息代理程式中內建一個可選的持久排程器。透過在 Xml 配置中將代理程式的 schedulerSupport 屬性設定為 true 來啟用它。ActiveMQ Classic 用戶端可以使用以下訊息屬性來利用延遲傳遞

檢查您的訊息屬性

訊息屬性 scheduledJobId 保留給 Job 排程器使用。如果此屬性在傳送之前設定,訊息將會立即傳送,而不會排程。此外,在接收排程訊息之後,屬性 scheduledJobId 將會設定在接收的訊息上,因此如果使用類似 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 專案標誌是 The Apache Software Foundation 的商標。版權所有 © 2024,The Apache Software Foundation。根據 Apache 授權條款 2.0 授權。