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