ActiveMQ 延遲和定時訊息投遞
延遲和定時訊息投遞(Delay and Schedule Message Delivery)
有時候我們不希望訊息馬上被broker投遞出去,而是想要訊息60秒以後發給消費者,或者我們想讓訊息沒隔一定時間投遞一次,一共投遞指定的次數。。。類似這種需求,ActiveMQ提供了一種broker端訊息定時排程機制。我們只需要把幾個描述訊息定時排程方式的引數作為屬性新增到訊息,broker端的排程器就會按照我們想要的行為去處理訊息。當然需要在xml中配置schedulerSupport屬性為true(broker的屬性)
一共有4個屬性
1:AMQ_SCHEDULED_DELAY :延遲投遞的時間
2:AMQ_SCHEDULED_PERIOD :重複投遞的時間間隔
3:AMQ_SCHEDULED_REPEAT:重複投遞次數
4:AMQ_SCHEDULED_CRON:Cron表示式
ActiveMQ也提供了一個封裝的訊息型別:org.apache.activemq.ScheduledMessage,可以使用這個類來輔助設定,使用例子如:延遲60秒
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);
例子:延遲30秒,投遞10次,間隔10秒:
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);
例子:使用 CRON 表示式,每個小時傳送一次
TextMessage message = session.createTextMessage("test msg");
message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *");
CRON表示式的優先順序高於另外三個引數,如果在設定了CRON的同時,也有repeat和period引數,則會在每次CRON執行的時候,重複投遞repeat次,每次間隔為period。就是說設定是疊加的效果。例如
每小時都會發生訊息被投遞10次,延遲1秒開始,每次間隔1秒:
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);