使用 RabbitMQ Binder 重试
在绑定器(binder)中启用重试时,监听器容器线程会在配置的任何退避(back off)期间挂起。这在单个消费者需要严格顺序的情况下可能很重要。然而,对于其他用例,这会阻止该线程处理其他消息。使用绑定器重试的替代方案是设置死信队列(DLQ)的存活时间(time to live)以及 DLQ 本身的死信配置。有关此处讨论的属性的更多信息,请参阅“RabbitMQ 绑定器属性”。你可以使用以下示例配置来启用此功能:
-
将
autoBindDlq
设置为true
。绑定器将创建一个死信队列(DLQ)。你可以选择在deadLetterQueueName
中指定一个名称。 -
将
dlqTtl
设置为你希望在重新投递之间等待的回退时间。 -
将
dlqDeadLetterExchange
设置为默认交换器。来自 DLQ 的过期消息将被路由到原始队列,因为默认的deadLetterRoutingKey
是队列名称(destination.group
)。通过将属性设置为空值来实现设置为默认交换器,如下一个示例所示。
要强制将消息标记为死信,可以抛出 AmqpRejectAndDontRequeueException
,或者将 requeueRejected
设置为 false
(默认值)并抛出任何异常。
循环会一直持续下去,这对于暂时性问题来说是没问题的,但你可能希望在尝试一定次数后放弃。幸运的是,RabbitMQ 提供了 x-death
头信息,它让你可以确定已经发生了多少次循环。
在放弃后确认消息时,抛出 ImmediateAcknowledgeAmqpException
。
章节总结
📄️ 将所有内容整合在一起
以下配置创建了一个名为 myDestination 的交换器,并将队列 myDestination.consumerGroup 绑定到一个主题交换器上,使用通配符路由键 #: