錯誤通道
從 1.3 版本開始,binder 會無條件地將例外狀況傳送到每個消費者目的地的錯誤通道,並且也可以設定為將非同步生產者傳送失敗傳送到錯誤通道。請參閱「錯誤處理」以取得更多資訊。
RabbitMQ 有兩種傳送失敗類型
-
退回訊息,
-
負面確認 發布者確認。
後者很少見。根據 RabbitMQ 文件 "[Nack] 僅會在負責佇列的 Erlang 程序中發生內部錯誤時傳遞。"。如果您發布到具有 reject-publish
佇列溢位行為的限定佇列,您也可能會收到負面確認。
除了啟用生產者錯誤通道 (如「錯誤處理」中所述),RabbitMQ binder 僅在連線工廠已適當設定時,才會將訊息傳送到通道,如下所示
-
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 流程來消費這些例外狀況。