rabbitmq 与 spring amqp - 消息在 AmqpException 情况下卡住

2023-12-07

我在我的消费者内部抛出 AmqpException 。 我的期望是消息将以 FIFO 顺序返回到队列,并在将来的某个时候重新处理。

Spring AMQP 似乎没有将消息释放回队列。而是尝试一遍又一遍地重新处理失败的消息。 这会阻止处理新到达的消息。卡住的那些在 AMQP 控制台中永远处于“未打包”状态。

有什么想法吗?


这就是rabbitmq/Spring AMQP的工作方式;如果消息被拒绝(抛出任何异常),则默认情况下该消息将重新排队并放回到队列的头部,以便立即重试。

... 将来某个时候重新处理。

您必须进行适当的配置才能实现这一点。

首先,您必须告诉代理不要重新排队消息。这是通过设置完成的defaultRequeueRejected在侦听器容器上设置为 false(默认情况下为 true)。或者,你可以抛出一个AmqpRejectAndDontRequeueException它指示容器拒绝(而不是重新排队)单个消息。

但这还没有结束。这样做只会导致被拒绝的消息被丢弃。

为了避免这种情况,你必须设置一个死信交换/队列对于队列 - 被拒绝的消息将被发送到 DLX/DLQ,而不是被丢弃。通常建议使用策略而不是队列参数。

最后,您可以设置消息在 DLQ 上的生存时间,以便在该时间之后,该消息将从队列中删除。如果您在以下位置设置了另一个适当的死信交换that队列(DLQ),您可以在时间到期后将消息重新排队回原始队列。

请注意,这仅适用于原始队列中被拒绝的交付;当该队列中的消息过期时它将不起作用。

See 这个答案以及其问题中的一些链接以获取更多详细信息。

您可以使用以下内容x-deathheader 来决定在一定次数的尝试后是否应该完全放弃(捕获异常并以某种方式处理坏消息;不要抛出异常,容器将确认消息)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

rabbitmq 与 spring amqp - 消息在 AmqpException 情况下卡住 的相关文章

  • 谁能告诉我 python 中的 pika 和 kombu 消息传递库有什么区别?

    我想在我的应用程序中使用消息传递库与rabbitmq交互 谁能解释一下 pika 和 kombu 库之间的区别吗 Kombu 和 pika 是两个不同的 Python 库 它们从根本上服务于相同的目的 向消息代理发布消息和使用消息代理发送消
  • rabbitmq-erlang-client,使用 rebar 友好的 pkg,在开发环境上工作在 rebar 版本上失败

    我成功地将rabbitmq erlang client的rebar友好包用于一个简单的Hello World rebarized和OTP 兼容 应用程序 并且在开发环境中工作正常 我能够启动 erl 控制台并执行我的操作applicatio
  • 列出与rabbitmq java客户端API交换的绑定

    我似乎在文档中找不到任何信息 所以我想知道是否可以通过某种方式使用 java RabbitMQ API 获取与交换相关的所有绑定 我在查询 api bindings 时正在寻找类似 http api 结果的内容 api definition
  • rabbitmq 通道因 PRECONDITION_FAILED 关闭 - 快速回复消费者不存在

    当我们从 Spring Boot 服务向rabbitmq 发布消息时 出现以下错误 而且这是间歇性的 我们无法重现这一点 AMQP 连接 123 11 xxx xx 5672 错误 org springframework amqp rabb
  • MongoDB 架构设计 - 实时聊天

    我正在启动一个项目 我认为该项目特别适合 MongoDB 因为它提供的速度和可扩展性 我目前感兴趣的模块是与实时聊天有关的 如果我要在传统的 RDBMS 中执行此操作 我会将其分为 频道 一个频道有很多用户 用户 一个用户有一个频道但有多条
  • Celery 任务状态取决于 CELERY_TASK_RESULT_EXPIRES

    据我所知 任务状态完全取决于 CELERY TASK RESULT EXPIRES 设置的值 如果我在任务完成执行后检查此间隔内的任务状态 则返回的状态为 AsyncResult task id state 是正确的 如果没有 状态将不会更
  • 死信交换 RabbitMQ 丢弃消息

    我正在尝试在 RabbitMQ 中实现 dlx 队列 场景很简单 我有 2 个队列 1 活着 2 死亡 x dead letter exchange 立即 x message ttl 5000 以及 立即 交换 这必然是 1 活着 我尝试运
  • 如何使用 Celery、RabbitMQ 和 Django 确保每个用户的任务执行顺序?

    我正在运行 Django Celery 和 RabbitMQ 我想要实现的是确保与一个用户相关的任务按顺序执行 具体来说 一次执行一个 我不希望每个用户执行任务并发 每当为用户添加新任务时 它应该取决于最近添加的任务 如果此类型的任务已为此
  • 使用 RabbitMq 锁定和批量获取消息

    我正在尝试以一种更非常规的方式使用 RabbitMq 尽管此时我可以根据需要选择任何其他消息队列实现 消费者不会将 Rabbit 推送消息留给我的消费者 而是连接到一个队列并获取一批 N 条消息 在此期间它会消费一些消息 并可能拒绝一些消息
  • Celery 与rabbitmq 创建结果多个队列

    我已经用 RabbitMQ 安装了 Celery 问题是 对于返回的每个结果 Celery 都会在 Rabbit 中创建队列 并在交换 celeryresults 中使用任务 ID 我仍然想得到结果 但在一个队列上 我的芹菜配置 from
  • RabbitMQ 上的 Nack 和拒绝

    我想处理消费者从队列中获取的不成功的消息并将它们重新排队 想象一下我有这样的情况 P gt foo bar baz gt C 其中 foo bar 和 baz 是消息 如果消费者读到baz但出了问题 我可以使用basic reject or
  • 在 Celery 工作线程中捕获 Heroku SIGTERM 以优雅地关闭工作线程

    我对此进行了大量研究 令我惊讶的是我还没有在任何地方找到一个好的答案 我正在 Heroku 上运行一个大型应用程序 并且我有某些运行很长时间处理的 celery 任务 并在任务结束时保存结果 每次我在 Heroku 上重新部署时 它都会发送
  • MassTransit 生成我想忽略的_skipped 队列

    任何人都可以猜出问题是什么 因为我不知道如何解决这个问题 大众运输产生 skipped队列 我不知道为什么它会生成这些队列 它是在执行发布请求响应时生成的 请求客户端是使用 MassTransit RequestClientExtensio
  • AMQPRuntimeException:读取数据时出错。收到 0 而不是预期的 7 字节

    它曾经有效 但现在不再有效了 我正在使用 php amqplib 和 RabbitMQ 当我尝试创建新的 AMQP 连接时 connection new AMQPConnection localhost 5672 username pass
  • RabbitMQ:如何创建和恢复备份

    我是 RabbitMQ 的新手 我需要一些帮助 如何备份和恢复到RabbitMQ 以及我需要保存哪些重要数据 谢谢 如果您安装了管理插件 您可以在Overview页 在底部你会看到导入 导出定义您可以使用它来下载代理的 JSON 表示形式
  • 生产者/消费者的不同语言

    我想知道是否可以通过 AMQP 和 RabbitMQ 对生产者和消费者使用不同的语言 例如 Java 代表生产者 python php 代表消费者 或者反之亦然 是的 AMQP 与语言无关 这意味着只要您有可以连接到 AMQP 的客户端sa
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • RabbitMQ 等待消息超时

    我想向 RabbitMQ 服务器发送一条消息 然后等待回复消息 在 回复 队列上 当然 我不想永远等待 以防处理这些消息的应用程序出现故障 需要有一个超时 这听起来像是一项非常基本的任务 但我找不到方法来做到这一点 我现在在使用 Java
  • 从 RabbitMQ 迁移到 Amazon SQS [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们的初创公司目前正在使用RabbitMQ with Python Django 对于消息队列 现在我们计划转移到Amazon SQS其高可用性
  • AMQP延迟传递并防止重复消息

    我有一个会偶尔生成消息的系统 我只想每 5 分钟提交零条或一条消息 如果没有生成消息 队列消费者将不会处理任何内容 如果 5 分钟内生成一百条相同的消息 我只希望从队列中使用其中一条 我正在使用AMQP RabbitMQ 有没有办法在rab

随机推荐