处理异常

默认情况下,如果注释监听器方法抛出异常,会被抛入容器,消息会被重新排队并重新投递、丢弃或路由到死信交换,具体取决于容器和代理配置。 发件人没有任何退回。spring-doc.cadn.net.cn

从2.0版本开始,@RabbitListener注释新增了两个属性:errorHandler返回例外.spring-doc.cadn.net.cn

这些都不是默认配置的。spring-doc.cadn.net.cn

你可以使用errorHandler提供豆子名称兔子听众错误处理者实现。 该功能接口有一种方法,具体如下:spring-doc.cadn.net.cn

@FunctionalInterface
public interface RabbitListenerErrorHandler {

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

}

如你所见,你可以访问从容器收到的原始消息——春季消息留言<?>由消息转换器生成的对象,以及监听者抛出的异常(包裹在ListenerExecutionFailedException). 错误处理程序可以返回某个结果(作为回复发送),也可以抛出原始或新的异常(抛入容器或返回发送方,具体取决于返回例外环境)。spring-doc.cadn.net.cn

返回例外属性,当true,导致异常返回给发送方。 该例外被包裹在远程调用结果对象。 在发送方,有可用的远程调用AwareMessageConverter适配器,如果配置为兔子模板, 重新抛出服务器端异常,包裹在AmqpRemoteException. 服务器异常的栈跟踪通过合并服务器和客户端栈轨迹来合成。spring-doc.cadn.net.cn

该机制通常只在默认情况下有效简易消息转换器,该系统使用Java序列化。 异常通常不“友好”于Jackson,且无法序列化为JSON。 如果你用 JSON,可以考虑使用errorHandler以换回其他对Jackson友好的作品错误当抛出异常时,object。
在2.1版本中,该接口从包中迁移O.S.AMQP.RABBIT.LISTENERO.S.AMQP.RABBIT.LISTENER.API.

从2.1.7版本开始,渠道可在消息消息头中获得;这样你就可以在使用失败消息时自动删除(ack)或 nack(失败消息)确认模式。手册: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 开始,如果抛出消息转换异常,错误处理程序将被调用,且消息论点。 这允许应用程序向呼叫者发送结果,表明收到了格式错误的消息。 此前,此类错误由容器抛出并处理。spring-doc.cadn.net.cn