错误通道
从 1.3 版本开始,binder 会无条件地将异常发送到每个消费者目的地的错误通道,并且还可以配置为将异步生产者发送失败的情况发送到错误通道。有关更多信息,请参阅“错误处理”。
RabbitMQ 有两种类型的发送失败:
- 
返回的消息, 
- 
负确认 发布者确认。 
后者很少见。根据 RabbitMQ 文档,“[一个 nack] 只有在负责队列的 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: 消息发布时使用的路由键。
另请参阅 Publisher Confirms 以获取接收返回消息的替代机制。
对于被否定确认的确认消息,其负载是一个 NackedAmqpMessageException,具有以下属性:
- 
failedMessage: 未能成功发送的 spring-messagingMessage<?>。
- 
nackReason: 失败的原因(如果有的话——你可能需要检查代理日志以获取更多信息)。
这些异常没有自动处理(例如发送到死信队列)。你可以通过自己的 Spring Integration 流程来消费这些异常。