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