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