rabbitmq延时队列消费者中发送另一个延时消息,会立刻发送的问题。

fat_jeremy 发布于 2018/11/02 11:43
阅读 134
收藏 1

我定义了两个延时队列ADD_QUEUE和DELETE_QUEUE,分别和两个rountingKey绑定。代码如下:

/**
     * 测试新增队列
     * @return
     */
    @Bean
    public Queue testAddQueue() {
        return new Queue(RabbitMqConstant.TEST_DELAY_ADD_QUEUE, true,false,false,null);
    }

    @Bean
    public Binding testAddQueueBinding() {
        return BindingBuilder.bind(testAddQueue()).to(delayPLugingExchange()).with(RabbitMqConstant.TEST_DELAY_ADD_ROUNTING_KEY).noargs();
    }

    /**
     * 测试删除队列
     * @return
     */
    @Bean
    public Queue testDeleteQueue() {
        return new Queue(RabbitMqConstant.TEST_DELAY_DELETE_QUEUE, true,false,false,null);
    }

    @Bean
    public Binding testDeleteQueueBinding() {
        return BindingBuilder.bind(testDeleteQueue()).to(delayPLugingExchange()).with(RabbitMqConstant.TEST_DELAY_DELETE_ROUNTING_KEY).noargs();
    }

在ADD_QUEUE的消费者中,又向DELETE_QUEUE发送一个延时为一年左右的延时消息,结果DELETE_QUEUE队列的消费者立刻接受到消息。当延时为几天时,则会正常延时发送。

ADD_QUEUE的消费者代码:

//add queue消费者
    @RabbitListener(queues = RabbitMqConstant.TEST_DELAY_ADD_QUEUE)
    @RabbitHandler
    public void testDelayAddQueue(String msg) {
        try {
            log.info("消息:::add:{}", msg);
            Map<String,Object> msgMap = JSON.parseObject(msg,HashMap.class);
            long end = (Long) msgMap.get("end");
//向delete queue发送延时消息。
            messageQueueService.send("1231",end,RabbitMqConstant.TEST_DELAY_DELETE_ROUNTING_KEY);
        } catch (Exception e) {
            log.error("消息异常:" , e);
        }

    }

当异步向delete queue发送消息时,则会正常延时发送。

跪求各位大神解释这是什么原因。或者哪里有文档可以看到这部分问题。

 

加载中
0
w
wailouci
延时队列不能有消费者,延时队列配置死信重新路由的队列,消费者消费路由后的队列
0
w
wailouci
你这是延时交换机插件实现的吧
fat_jeremy
fat_jeremy
对的,不是用的死信队列,用的插件实现的。
0
w
wailouci
延时交换机的话要给交换机投递
fat_jeremy
fat_jeremy
交换机的类型设置为延时类型的,我上面说的问题不知道什么原因。
0
逆流de鱼
逆流de鱼

延迟队列通过设置交换机为delay实现,可以参考下我代码:https://github.com/lucky8987/spring-rabbit-demo

0
w
wailouci
发送逻辑贴出来
0
fat_jeremy
fat_jeremy

我发现了问题,因为设置的延时时间超过了一个月,就会立即发送,而不是延时。文档里面没有找到。

返回顶部
顶部