菜鸟程序员yang 2024-06-06 10:29 采纳率: 0%
浏览 5

RabbitMQ问题

RabbitMQ消息超过并没有跳转到死信队列

先说下问题 现在发一条消息到QUEUE_ORDER队列里 我在队列里设置了消息存活5秒超时时长现在就是感觉设置的5秒时长没有生效 消息超时了一直在队列里没有跳转到死信队列,麻烦各位告人帮忙看下多谢了!代码在下面!

img


////////////////////////////////////////////

img

代码
首先是RabbitMQ 配置类定义了交换机、队列和绑定规则,确保消息过期后会被转发到死信队列。我在这里设置了消息停留在队列5秒过期时间并跳转到死信队列。

img

然后我现在.yml里配置的是手动签收,这里是我的两个消费者,在订单消费者模拟长时间处理,超过 TTL 5 秒 而且并没有做手动签收操作 说明消息不会被消费掉而且阻塞时间大于超时时长只会去跳转到死信

img

然后这是我的生产者

img

对了 还有个事就是我把QUEUE_ORDER消费者注释掉 消息超过5秒就会跳转到死信队列,这是咋回事啊!

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 10:29
    关注

    引自免费微信小程序:皆我百晓生

    看起来您已经正确地配置了RabbitMQ以在消息超时后将其移动到死信队列。然而,有些部分可能需要调整以确保消息按照预期的行为工作。

    首先,让我们确认一下您的配置是否正确。根据您提供的信息,您已经在queueorder()方法中设置了x-message-ttl参数,这应该会触发消息的超时。但是,为了更明确地检查超时行为,请尝试将x-message-ttl值从5000(代表5秒)增加到一个较大的值,例如50000(代表50秒),这样可以更容易观察到超时效果。

    接下来,关于消息在没有消费者时能正确转移到死信队列的情况,这是因为当队列没有消费者连接时,RabbitMQ会立即执行任何与队列相关的定时任务,包括超时和死信策略。当有消费者连接时,RabbitMQ会在消费者处理消息的过程中监控消息的超时情况。在这种情况下,由于订单消费者(handleorderQueue方法)模拟了一个超过超时时间的处理过程,并且没有手动签收消息,因此消息应该会等待消费者处理完毕,而不是立即进入死信队列。

    要解决这个问题,您需要确保在消费者处理过程中对消息进行签收。如果您想让消息在超时后自动跳转到死信队列,而不必在消费者代码中显式地调用basicAck,那么您应该使用自动确认机制。在Spring Boot中,可以通过在配置文件中启用自动确认来实现这一点。例如,在application-test.yml中添加以下内容:

    spring:
      rabbitmq:
        listener:
          acknowledge-mode: AUTO
    

    这将使所有消费者默认采用自动确认模式,当消息被传递给消费者后,RabbitMQ会自动将其标记为已读。这样,如果消费者未在超时时间内处理消息,RabbitMQ将自动将消息移动到死信队列。

    另外,如果您希望保留手动确认功能,确保在handleorderQueue方法中始终调用channel.basicAck,即使在处理失败的情况下也要调用basicNack。这可以确保无论发生什么情况,RabbitMQ都能正确处理消息状态。

    总结一下,您可以尝试以下步骤来调试和修复问题:

    1. x-message-ttl值增大到一个更容易观察到超时效果的值(比如50000)。
    2. application-test.yml中启用自动确认模式,或者确保在消费者代码中正确处理消息并调用basicAckbasicNack
    3. 如果仍然有问题,检查日志以了解RabbitMQ是否正在执行预期的操作,以及是否有任何错误或警告。

    这样应该能让您的系统按照预期处理超时消息。如果有其他问题,请提供更多信息以便进一步分析。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 在虚拟机环境下完成以下,要求截图!
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见