最近在做的項目中有一個業務涉及到了訂單的有效期的問題(即訂單達到一定的時間未支付完成就讓該訂單失效),于是就想到了延時隊列的方式,由于項目采用的是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 的延時功能就可以正常執行了