天天看點

activemq 延時隊列以及不生效問題

最近在做的項目中有一個業務涉及到了訂單的有效期的問題(即訂單達到一定的時間未支付完成就讓該訂單失效),于是就想到了延時隊列的方式,由于項目采用的是activemq,是以就寫了個activemq延時隊列代碼如下:

發送方代碼如下:

/**
     * 發送延遲消息
     * @param msg
     * @param delay
     */
    public void send(Queue queue, String msg, long delay) {
        _log.info("發送MQ延時消息:msg={},delay={}", msg, delay);
        jmsTemplate.send(queue, new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                TextMessage tm = session.createTextMessage(msg);
                tm.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_DELAY, delay);
                tm.setLongProperty(ScheduledMessage.AMQ_SCHEDULED_REPEAT, 1);
                return tm;
            }
        });
    }
           

接收方代碼如下:

@JmsListener(destination = MqConfig.DELAY_ORDER_QUEUE_NAME)
    @Async("mqExecutor")
    public void receive(String orderId) {
        String logPrefix = "【訂單過期延時隊列】";
        if (StringUtils.isEmpty(orderId)) {
            return;
        }
        _log.info("{}接收消息:payOrderId={}", logPrefix, orderId);
       //@todo 
    }
           

然鵝,一切并沒有如想象中那麼順利,訂單發送到延時隊列後立刻就被消費到了。。。

最後在網上的搜尋過程中去檢視了一下官方的文檔, linux 版的activemq 和window 下的mq 沒有開啟延時功能,這時需要我們去mq 的配置檔案中去将mq 的延時功能打開 ,巨坑啊。。。。

開啟方式如下:

在mq 的安裝目錄下 的conf/activemq.xml 

在配置檔案的40 行裡加上 

schedulerSupport="true"

效果如下:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulerSupport="true">

           
activemq 延時隊列以及不生效問題

将修改的檔案儲存,服務重新開機,mq 的延時功能就可以正常執行了