使用 RabbitMQ Binder 进行重试
在 Binder 内部启用重试时,监听容器线程会在配置的任何退避期间暂停。这在需要单个消费者严格排序时可能很重要。然而,对于其他用例,这会阻止在该线程上处理其他消息。使用 Binder 重试的一种替代方法是设置死信队列 (DLQ) 并配置死信队列本身的存活时间 (TTL) 和死信配置。有关此处讨论的属性的更多信息,请参阅“RabbitMQ Binder 属性”。您可以使用以下示例配置来启用此功能
-
将
autoBindDlq
设置为true
。Binder 将创建一个 DLQ。可选地,您可以在deadLetterQueueName
中指定名称。 -
将
dlqTtl
设置为您希望在重新投递之间等待的退避时间。 -
将
dlqDeadLetterExchange
设置为默认交换器。来自 DLQ 的过期消息将被路由回原始队列,因为默认的deadLetterRoutingKey
是队列名称(即destination.group
)。通过不设置属性值可以达到设置为默认交换器的目的,如下一个示例所示。
要强制消息成为死信,可以抛出 AmqpRejectAndDontRequeueException
异常,或者将 requeueRejected
设置为 false
(默认值)并抛出任何其他异常。
这种循环会无限持续,对于瞬时问题来说没问题,但您可能希望在尝试一定次数后放弃。幸运的是,RabbitMQ 提供了 x-death
头部,通过它可以确定已经发生了多少次循环。
在放弃后确认消息,可以抛出 ImmediateAcknowledgeAmqpException
异常。