文章出處

在開發業務系統時,某些業務場景需要消息定時發送或延時發送(類似:飛信的短信定時發送需求),這時候就需要用到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表達式解釋 (英文)

4、kahaDB官方文檔

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()