有時(shí)候我們不希望消息馬上被broker投遞出去,而是想要消息60秒以后發(fā)給消費者,或者我們想讓消息沒(méi)隔一定時(shí)間投遞一次,一共投遞指定的次數。。。
類(lèi)似這種需求,ActiveMQ提供了一種broker端消息定時(shí)調度機制。
我們只需要把幾個(gè)描述消息定時(shí)調度方式的參數作為屬性添加到消息,broker端的調度器就會(huì )按照我們想要的行為去處理消息。
一共有四個(gè)屬性:
| Property name | type | description |
|---|---|---|
| AMQ_SCHEDULED_DELAY | long | 延遲投遞的時(shí)間 |
| AMQ_SCHEDULED_PERIOD | long | 重復投遞的時(shí)間間隔 |
| AMQ_SCHEDULED_REPEAT | int | 重復投遞次數 |
| AMQ_SCHEDULED_CRON | String | Cron表達式 |
當然ActiveMQ也提供了一個(gè)封裝的消息類(lèi)型: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秒:
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 表達式的例子:
MessageProducer producer = session.createProducer(destination); TextMessage message = session.createTextMessage("test msg"); message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, "0 * * * *"); producer.send(message);
CRON表達式的優(yōu)先級高于另外三個(gè)參數,如果在設置了CRON的同時(shí),也有repeat和period參數,則會(huì )在每次CRON執行的時(shí)候,重復投遞repeat次,每次間隔為period。就是說(shuō)設置是疊加的效果。例如每小時(shí)都會(huì )發(fā)生消息被投遞10次,延遲1秒開(kāi)始,每次間隔1秒:
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);
聯(lián)系客服