錯誤通道
從 1.3 版本開始,繫結器會無條件地將異常傳送到每個消費者目的地的錯誤通道,並且還可以配置為將非同步生產者傳送失敗傳送到錯誤通道。更多資訊請參閱“錯誤處理”。
RabbitMQ 有兩種傳送失敗型別
-
被退回的訊息,
-
負確認的 釋出者確認。
後者很少見。根據 RabbitMQ 文件,“[負確認]只會在負責佇列的 Erlang 程序發生內部錯誤時才會傳送。”如果您向具有 reject-publish 佇列溢位行為的有界佇列釋出訊息,也可能收到負確認。
除了啟用生產者錯誤通道(如“錯誤處理”中所述)外,RabbitMQ 繫結器僅在連線工廠配置正確時才向通道傳送訊息,具體如下:
-
ccf.setPublisherConfirms(true); -
ccf.setPublisherReturns(true);
當使用 Spring Boot 配置連線工廠時,設定以下屬性
-
spring.rabbitmq.publisher-confirms -
spring.rabbitmq.publisher-returns
退回訊息的 ErrorMessage 的有效載荷是一個 ReturnedAmqpMessageException,具有以下屬性
-
failedMessage: 未能傳送的 spring-messagingMessage<?>。 -
amqpMessage: 原始的 spring-amqpMessage。 -
replyCode: 指示失敗原因的整數值(例如,312 - 無路由)。 -
replyText: 指示失敗原因的文字值(例如,NO_ROUTE)。 -
exchange: 訊息釋出的交換器。 -
routingKey: 訊息釋出時使用的路由鍵。
另請參閱 釋出者確認,瞭解接收退回訊息的替代機制。
對於負確認的確認,有效載荷是一個 NackedAmqpMessageException,具有以下屬性
-
failedMessage: 未能傳送的 spring-messagingMessage<?>。 -
nackReason: 原因(如果可用 — 您可能需要檢查代理日誌以獲取更多資訊)。
這些異常沒有自動處理(例如傳送到死信佇列)。您可以使用自己的 Spring Integration 流來處理這些異常。