错误通道
从 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 来处理这些异常。