此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring AMQP 3.2.6spring-doc.cadn.net.cn

处理异常

默认情况下,如果带注释的侦听器方法抛出异常,则会将其抛出到容器中,并且消息将重新排队并重新传递、丢弃或路由到死信交换,具体取决于容器和代理配置。 不会向发件人返回任何内容。spring-doc.cadn.net.cn

从 2.0 版开始,@RabbitListener注释有两个新属性:errorHandlerreturnExceptions.spring-doc.cadn.net.cn

默认情况下,这些选项未配置。spring-doc.cadn.net.cn

您可以使用errorHandler提供RabbitListenerErrorHandler实现。 该函数接口有一个方法,如下所示:spring-doc.cadn.net.cn

@FunctionalInterface
public interface RabbitListenerErrorHandler {

    Object handleError(Message amqpMessage, org.springframework.messaging.Message<?> message,
              ListenerExecutionFailedException exception) throws Exception;

}

如您所见,您可以访问从容器 spring-messaging 接收的原始消息Message<?>消息转换器生成的对象,以及侦听器抛出的异常(包装在ListenerExecutionFailedException). 错误处理程序可以返回一些结果(作为回复发送)或抛出原始异常或新异常(抛出到容器或返回给发送方,具体取决于returnExceptions设置)。spring-doc.cadn.net.cn

returnExceptions属性,当true,导致异常返回给发送方。 异常包装在RemoteInvocationResult对象。 在发送方方面,有一个可用的RemoteInvocationAwareMessageConverterAdapter,如果配置为RabbitTemplate,重新抛出服务器端异常,包装在AmqpRemoteException. 服务器异常的堆栈跟踪是通过合并服务器和客户端堆栈跟踪来合成的。spring-doc.cadn.net.cn

此机制通常仅适用于默认的SimpleMessageConverter,它使用 Java 序列化。 异常通常不是“Jackson友好的”,不能序列化为 JSON。 如果您使用 JSON,请考虑使用errorHandler返回其他一些对Jackson友好的Error对象。
在 2.1 版本中,此接口从 packageo.s.amqp.rabbit.listenero.s.amqp.rabbit.listener.api.

从 2.1.7 版本开始,Channel在消息传递消息头中可用;这允许您在使用AcknowledgeMode.MANUAL:spring-doc.cadn.net.cn

public Object handleError(Message amqpMessage, org.springframework.messaging.Message<?> message,
          ListenerExecutionFailedException exception) {
              ...
              message.getHeaders().get(AmqpHeaders.CHANNEL, Channel.class)
                  .basicReject(message.getHeaders().get(AmqpHeaders.DELIVERY_TAG, Long.class),
                               true);
          }

从 2.2.18 版本开始,如果抛出消息转换异常,将调用错误处理程序,并nullmessage论点。 这允许应用程序向调用方发送一些结果,指示收到格式错误的消息。 以前,此类错误是由容器抛出和处理的。spring-doc.cadn.net.cn