activemq 延时队列以及不生效问题
程序员文章站
2024-02-04 15:26:34
...
最近在做的项目中有一个业务涉及到了订单的有效期的问题(即订单达到一定的时间未支付完成就让该订单失效),于是就想到了延时队列的方式,由于项目采用的是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 的延时功能就可以正常执行了
推荐阅读