带有 spring amqp 的 rabbitmq - 出现 AmqpException 时消息卡住
rabbitmq with spring amqp - messages stuck in case of AmqpException
我在我的消费者中抛出一个 AmqpException。
我的期望是消息将 return 按 FIFO 顺序返回队列,并在将来的某个时间重新处理。
似乎Spring AMQP 没有将消息释放回队列。而是尝试一遍又一遍地重新处理失败的消息。
这会阻止处理新到达的消息。卡住的那些在 AMQP 控制台内永远显示 "unpacked" 状态。
有什么想法吗?
这就是 rabbitmq/Spring AMQP 的工作方式;如果一条消息被拒绝(抛出任何异常),则该消息默认被重新 queued 并放回 queue 的头部,因此会立即重试。
... reprocessed sometime in the future.
您必须适当地配置才能实现这一点。
首先,您必须告诉经纪人不要重新queue该消息。这是通过将侦听器容器上的 defaultRequeueRejected
设置为 false(默认情况下为 true)来完成的。或者,您可以抛出一个 AmqpRejectAndDontRequeueException
指示容器拒绝(而不是重新queue)单个消息。
但这还没有结束;这样做只会导致被拒绝的消息被丢弃。
为了避免这种情况,您必须为 queue 设置一个 Dead Letter Exchange/Queue - 被拒绝的邮件然后被发送到 DLX/DLQ 而不是被丢弃。通常建议使用策略而不是 queue 参数。
最后,您可以设置消息在 DLQ 上的生存时间,以便在该时间之后,消息将从 queue 中删除。如果您在 that queue(DLQ)上设置另一个适当的死信交换,您可以使消息重新queued 回到原来的状态queue时间到期后。
请注意,这仅适用于来自原始 queue 的拒绝交付;在 queue.
中使消息过期时它将不起作用
有关详细信息,请参阅 this answer 及其问题中的一些链接。
您可以使用 x-death
header 的内容来决定您是否应该在尝试一些次数后完全放弃(捕获异常并以某种方式处理错误消息;不要抛出异常,容器将确认消息)。
这是我用来解决这个问题的解决方案。我设置了一个拦截器以在应用退避策略时重试消息 x 次。
http://trippstech.blogspot.com/2016/03/rabbitmq-deadletter-queue-with.html
我在我的消费者中抛出一个 AmqpException。 我的期望是消息将 return 按 FIFO 顺序返回队列,并在将来的某个时间重新处理。
似乎Spring AMQP 没有将消息释放回队列。而是尝试一遍又一遍地重新处理失败的消息。 这会阻止处理新到达的消息。卡住的那些在 AMQP 控制台内永远显示 "unpacked" 状态。
有什么想法吗?
这就是 rabbitmq/Spring AMQP 的工作方式;如果一条消息被拒绝(抛出任何异常),则该消息默认被重新 queued 并放回 queue 的头部,因此会立即重试。
... reprocessed sometime in the future.
您必须适当地配置才能实现这一点。
首先,您必须告诉经纪人不要重新queue该消息。这是通过将侦听器容器上的 defaultRequeueRejected
设置为 false(默认情况下为 true)来完成的。或者,您可以抛出一个 AmqpRejectAndDontRequeueException
指示容器拒绝(而不是重新queue)单个消息。
但这还没有结束;这样做只会导致被拒绝的消息被丢弃。
为了避免这种情况,您必须为 queue 设置一个 Dead Letter Exchange/Queue - 被拒绝的邮件然后被发送到 DLX/DLQ 而不是被丢弃。通常建议使用策略而不是 queue 参数。
最后,您可以设置消息在 DLQ 上的生存时间,以便在该时间之后,消息将从 queue 中删除。如果您在 that queue(DLQ)上设置另一个适当的死信交换,您可以使消息重新queued 回到原来的状态queue时间到期后。
请注意,这仅适用于来自原始 queue 的拒绝交付;在 queue.
中使消息过期时它将不起作用有关详细信息,请参阅 this answer 及其问题中的一些链接。
您可以使用 x-death
header 的内容来决定您是否应该在尝试一些次数后完全放弃(捕获异常并以某种方式处理错误消息;不要抛出异常,容器将确认消息)。
这是我用来解决这个问题的解决方案。我设置了一个拦截器以在应用退避策略时重试消息 x 次。 http://trippstech.blogspot.com/2016/03/rabbitmq-deadletter-queue-with.html