错误通道
从 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-messaging `Message<?>`。
-
`amqpMessage`:原始 spring-amqp `Message`。
-
`replyCode`:表示失败原因的整数值(例如,312 - 没有路由)。
-
`replyText`:表示失败原因的文本值(例如,`NO_ROUTE`)。
-
`exchange`:发布消息的交换机。
-
`routingKey`:发布消息时使用的路由键。
另请参阅 发布者确认,了解接收返回消息的替代机制。
对于否定确认的确认,有效负载是具有以下属性的 `NackedAmqpMessageException`:
-
`failedMessage`:发送失败的 spring-messaging `Message<?>`。
-
`nackReason`:原因(如果可用——您可能需要检查代理日志以获取更多信息)。
这些异常没有自动处理(例如,发送到 死信队列)。您可以使用自己的 Spring Integration 流来消费这些异常。