首先,我介绍一下我的案例背景:
我在用spring-boot
and spring-rabbitmq
。它对我有用,你应该知道我必须为收到的消息实现自定义转换器。
(1)从这个转换器可以抛出异常,例如在不正确的消息等情况下。
(2)成功转换后(无例外)侦听器被调用。然后,在监听器中也可以抛出异常。
现在,我想强迫两件事:
(1')如果转换器出现异常,请勿重新排队消息。简单地说,向队列发送确认并模拟一切正常。
(2')在这种情况下,默认设置是什么?当内部spring-rabbitmq engine
决定向队列发送确认?当它决定命令重新排队时?是否可以根据情况进行管理?
我在文档中找到:
如果未启用重试并且侦听器抛出异常,则通过
默认情况下,将无限期地重试交付。你可以修改这个
行为有两种方式;将 defaultRequeueRejected 属性设置为 false
并且将尝试零重新交付;或者,抛出一个
AmqpRejectAndDontRequeueException 来发出消息信号应该是
拒绝。这是启用重试时使用的机制
已达到最大投递尝试次数。
例如,在取决于侦听器中捕获的异常中,我应该决定是否要重新排队消息,正如我所想的那样(只需从catch
AmqpRejectAndDontRequeueException
)。我不确定这是否是好方法,这就是为什么我要询问您的意见。
请阅读参考手册 http://docs.spring.io/spring-amqp//reference/html/.
该行为(主要)由ErrorHandler
.
Throw a MessageConversionException
- 容器对大多数异常重新排队消息,但某些异常被认为是致命的。一般来说,如果消息无法转换,那么重新传递它就没有意义。
这一切都在名为(令人惊讶?)的部分中清楚地解释了异常处理 http://docs.spring.io/spring-amqp//reference/html/_reference.html#exception-handling
从版本 1.3.2 开始,默认的 ErrorHandler 现在是 ConditionalRejectingErrorHandler ,它将拒绝(而不是重新排队)因不可恢复错误而失败的消息:
osamqp...MessageConversionException
os.messaging...MessageConversionException
os.messaging...MethodArgumentNotValidException
os.messaging...MethodArgumentTypeMismatchException
java.lang.NoSuchMethodException
java.lang.ClassCastException
当使用 MessageConverter 转换传入消息有效负载时,可能会引发第一个错误。如果映射到 @RabbitListener 方法时需要额外转换,则转换服务可能会抛出第二个错误。如果在侦听器中使用验证(例如@Valid)并且验证失败,则可能会抛出第三个错误。如果入站消息转换为对于目标方法不正确的类型,则可能会抛出第四个错误。例如,参数声明为Message,但接收到的是Message。
第五和第六是1.6.3版本中添加的。
您可以自定义ErrorHandler
如所须。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)