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