|
该版本仍在开发中,尚未被视为稳定。请使用最新的稳定版本,使用 Spring AMQP 4.0.0! |
处理异常
默认情况下,如果带注释的监听器方法抛出异常,该异常会被抛入容器,消息会被重新排队并重新投递、丢弃或路由到死信交换,具体取决于容器和代理配置。发送方不会返回任何内容。
从2.0版本开始,@RabbitListener注释新增了两个属性:errorHandler和返回例外.
这些都不是默认配置的。
你可以使用errorHandler提供豆子名称兔子听众错误处理者实现。 该功能接口有一种方法,具体如下:
@FunctionalInterface
public interface RabbitListenerErrorHandler {
Object handleError(Message amqpMessage, org.springframework.messaging.Message<?> message,
ListenerExecutionFailedException exception) throws Exception;
}
如你所见,你可以访问从容器收到的原始消息——春季消息留言<?>由消息转换器生成的对象,以及监听者抛出的异常(包裹在ListenerExecutionFailedException). 错误处理程序可以返回某个结果(作为回复发送),也可以抛出原始或新的异常(抛入容器或返回发送方,具体取决于返回例外环境)。
这返回例外属性,当true,导致发送方返回异常。异常被包裹在远程调用结果对象。 在发送方,有可用的远程调用AwareMessageConverter适配器,如果配置为兔子模板, 重新抛出服务器端异常,包裹在AmqpRemoteException. 服务器异常的栈跟踪通过合并服务器和客户端栈轨迹来合成。
该机制通常只在默认情况下有效简易消息转换器该异常使用 Java 序列化。例外通常不“友好”于 Jackson,且无法序列化为 JSON。如果你使用 JSON,请考虑使用errorHandler以换回其他对Jackson友好的作品错误当抛出异常时,object。 |
在2.1版本中,该接口从包中迁移O.S.AMQP.RABBIT.LISTENER自O.S.AMQP.RABBIT.LISTENER.API. |
从2.1.7版本开始,渠道可在消息消息头中获得;这允许你在使用确认模式。手册:
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 开始,如果抛出消息转换异常,错误处理程序将被调用,且零在消息论点。 这使得应用程序能够向调用者发送某个结果,表明收到了格式错误的消息。此前,此类错误会被抛出并由容器处理。