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);