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 的延时功能就可以正常执行了