使用 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 异常。