延遲與排程訊息傳遞
從 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);