首先,我介绍一下我的情况: 我正在使用spring-boot和spring-rabbitmq。它对我有用,您应该知道我必须为收到的消息实现自定义转换器。 (1) 例如,在消息不正确的情况下,可能从此转换器引发异常。 (2) 成功转换后(无异常),将调用侦听器。然后,在侦听器中也可以引发异常。
spring-boot
spring-rabbitmq
现在,我想强制说明两件事: (1’) 不要在转换器中出现消息的情况下重新排队消息。只需发送确认即可排队并模拟一切正常。 (2’) 在这种情况下,默认设置是什么?内部何时spring-rabbitmq engine决定发送确认到队列?什么时候决定重新排队的命令?是否可以根据情况进行管理?
spring-rabbitmq engine
我在文档中找到了:
如果未启用重试并且侦听器引发异常,则默认情况下将无限期重试传递。您可以通过两种方式修改此行为:将defaultRequeueRejected属性设置为false,将尝试进行零次重新传递;或者,抛出一个AmqpRejectAndDontRequeueException以指示该消息应被拒绝。这是启用重试并达到最大传送尝试次数时使用的机制。
例如,根据侦听器中捕获到的异常,我应该决定是否要按我的想法对消息进行排队(只需通过抛出from即可catch AmqpRejectAndDontRequeueException)。我不确定这是否是好方法,这就是为什么我要问您关于您的意见的原因。
catch
AmqpRejectAndDontRequeueException
请阅读参考手册。
该行为(主要)由所控制ErrorHandler。
ErrorHandler
引发MessageConversionException-容器为大多数异常重新排队消息,但某些异常被认为是致命的。通常,如果无法转换邮件,则重新传递它是没有意义的。
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中添加了第五和第六。
从版本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需要自定义。