1. 程式人生 > >activeMq延遲消息隊列

activeMq延遲消息隊列

onf 名稱 使用 優先 傳遞 sched 官方 保留 route

Long delay = 30 * 1000L;
jmsTemplate.send(type.getValue(),new MessageCreator() {
@Override
public Message createMessage(Session session) throws JMSException {
TextMessage message = session.createTextMessage();
message.setText(JSON.toJSONString(data));
message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
return message;
}
});
延時三秒發送消息

版本5.4的 ActiveMQ 具有內置於ActiveMQ消息代理中的可選持久調度程序。通過Xml配置中將broker schedulerSupport屬性設置為true 來啟用它ActiveMQ客戶端可以通過使用以下消息屬性來利用延遲傳遞:

檢查郵件屬性

message屬性scheduledJobId 保留供Job Scheduler使用。如果在發送之前設置了此屬性,則將立即發送消息而不安排該消息。此外,在收到預定的消息後,scheduledJobId 將在接收的消息上設置屬性,因此如果使用類似Camel Route的內容可能會記住這一點,這可能會在重新發送消息時自動復制屬性。

Property nametypedescription
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條目設置repeat和period,則ActiveMQ調度程序將在每次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);

官方文檔:http://activemq.apache.org/delay-and-schedule-message-delivery.html

activeMq延遲消息隊列