欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

activemq 延时队列以及不生效问题

将修改的文件保存,服务重启,mq 的延时功能就可以正常执行了