一尘不染

将确认发送到Rabbitmq服务器取决于转换器和侦听器

spring-boot

首先,我介绍一下我的情况:
我正在使用spring-bootspring-rabbitmq。它对我有用,您应该知道我必须为收到的消息实现自定义转换器。
(1) 例如,在消息不正确的情况下,可能从此转换器引发异常。
(2) 成功转换后(无异常),将调用侦听器。然后,在侦听器中也可以引发异常。


现在,我想强制说明两件事:
(1’) 不要在转换器中出现消息的情况下重新排队消息。只需发送确认即可排队并模拟一切正常。
(2’) 在这种情况下,默认设置是什么?内部何时spring-rabbitmq engine决定发送确认到队列?什么时候决定重新排队的命令?是否可以根据情况进行管理?

我在文档中找到了:

如果未启用重试并且侦听器引发异常,则默认情况下将无限期重试传递。您可以通过两种方式修改此行为:将defaultRequeueRejected属性设置为false,将尝试进行零次重新传递;或者,抛出一个AmqpRejectAndDontRequeueException以指示该消息应被拒绝。这是启用重试并达到最大传送尝试次数时使用的机制。

例如,根据侦听器中捕获到的异常,我应该决定是否要按我的想法对消息进行排队(只需通过抛出from即可catch
AmqpRejectAndDontRequeueException)。我不确定这是否是好方法,这就是为什么我要问您关于您的意见的原因。


阅读 268

收藏
2020-05-30

共1个答案

一尘不染

请阅读参考手册

该行为(主要)由所控制ErrorHandler

引发MessageConversionException-容器为大多数异常重新排队消息,但某些异常被认为是致命的。通常,如果无法转换邮件,则重新传递它是没有意义的。

所有这些都在名为“ 异常处理”的部分(令人惊讶地?)中清楚地说明了

从版本1.3.2开始,默认的ErrorHandler现在是ConditionalRejectingErrorHandler,它将拒绝(而不是重新排队)由于不可恢复的错误而失败的消息:

osamqp … MessageConversionException

osmessaging … MessageConversionException

osmessaging … MethodArgumentNotValidException

osmessaging … MethodArgumentTypeMismatchException

java.lang.NoSuchMethodException

java.lang.ClassCastException

使用MessageConverter转换传入的消息有效负载时,可以引发第一个。如果映射到@RabbitListener方法时需要其他转换,则转换服务可能会抛出第二个。如果在侦听器中使用了验证(例如@Valid),并且验证失败,则可能引发第三个事件。如果将入站消息转换为对目标方法不正确的类型,则可能会抛出第四个错误。例如,将该参数声明为Message,但收到Message。

在版本1.6.3中添加了第五和第六。

您可以根据ErrorHandler需要自定义。

2020-05-30