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">

將修改的文件保存,服務重啓,mq 的延時功能就可以正常執行了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章