在開發業務系統時,某些業務場景需要消息定時發送或延時發送(類似:飛信的短信定時發送需求),這時候就需要用到activemq的消息延時投遞,詳細的文檔可參考官網說明,本文只介紹二種常用的用法:
注:本文采用spring的JmsTemplate來發送消息
步驟1、首先要修改activemq.xml配置文件,啟用延時投遞
1 <broker xmlns="http://activemq.apache.org/schema/core" ... schedulerSupport="true" > 2 ... 3 </broker>
即:在broker節點加上schedulerSupport="true",然后重啟activemq即可
步驟2、定義一個MessagePostProcessor的實現類
import javax.jms.JMSException; import javax.jms.Message; import lombok.Data; import org.apache.activemq.ScheduledMessage; import org.apache.commons.lang3.StringUtils; import org.springframework.jms.core.MessagePostProcessor; /** * MQ延時投遞處理器(注:ActiveMQ的配置文件中,要配置schedulerSupport="true",否則不起作用) * by: 楊俊明 2016-06-16 */ @Data public class ScheduleMessagePostProcessor implements MessagePostProcessor { private long delay = 0l; private String corn = null; public ScheduleMessagePostProcessor(long delay) { this.delay = delay; } public ScheduleMessagePostProcessor(String cron) { this.corn = cron; } public Message postProcessMessage(Message message) throws JMSException { if (delay > 0) { message.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay); } if (!StringUtils.isEmpty(corn)) { message.setStringProperty(ScheduledMessage.AMQ_SCHEDULED_CRON, corn); } return message; } }
步驟3、jmsTemplate發送示例
Object message1 = "corn消息內容:" + DateUtil.formatDate(new Date()); //分 時 天 月 星期幾 jmsTemplate.convertAndSend(message1, new ScheduleMessagePostProcessor("40 22 * * *")); logger.info("消息1:[" + message1 + "] 延時發送成功!"); jmsTemplate.convertAndSend(message1, new ScheduleMessagePostProcessor("50 22 * * *")); logger.info("消息1:[" + message1 + "] 延時發送成功!"); Object message2 = "message:" + DateUtil.formatDate(new Date()); jmsTemplate.convertAndSend(message2, new ScheduleMessagePostProcessor(30 * 1000));//延時30秒 jmsTemplate.convertAndSend(message2, new ScheduleMessagePostProcessor(3600 * 24 * 1000));//延時24小時 logger.info("消息2:[" + message2 + "] 延時發送成功!");
上面的代碼演示了二種延時的用法:延時N毫秒、按corn表達式延時(注:此corn表達式并非Quartz框架中的corn表達式,而是linux中corntab中的表達 式,基本順序是"分(0-59) 時(0-23) 日(1-31) 月(1-12) 星期幾(1-7) ")
發送成功后,可以登錄activemq的webconsole查看消息的屬性:
在scheduled面板中,可以看到延時的消息
注:在開啟消息持久化存儲的前提下,就算把相應的queue在webconsole面板中刪除(即刪除隊列),只要投遞的時間尚未到,該消息也不會刪除,仍然能正常延時投遞。
此外,在queues面板中,如何查看某條具體的消息,也可以通過屬性發現這條消息是延時消息,參考下圖:
參考文章:
1、Delay and Schedule Message Delivery
2、喂雞百科上的Corn表達式解釋 (中文)
3、喂雞百科上的Corn表達式解釋 (英文)
文章列表