Java 向中的rabbitmq服务器发送确认取决于转换器和侦听器
首先,我介绍我的案例背景:Java 向中的rabbitmq服务器发送确认取决于转换器和侦听器,java,spring-boot,spring-amqp,spring-rabbit,Java,Spring Boot,Spring Amqp,Spring Rabbit,首先,我介绍我的案例背景: 我正在使用springboot和springrabbitmq。它对我有效,你应该知道我必须为收到的消息实现自定义转换器。 (1)可以从该转换器引发异常,例如在inproper消息等情况下。 (2)成功转换后(无异常)调用侦听器。然后,在侦听器中也可以抛出异常 现在,我想强调两件事: (1')在转换器中导出时,不要重新获取消息。简单地说,向队列发送确认,并模拟一切正常。 (2')在这种情况下,默认设置是什么?当内部spring rabbitmq引擎决定向队列发送确认时
我正在使用
springboot
和springrabbitmq
。它对我有效,你应该知道我必须为收到的消息实现自定义转换器。(1)可以从该转换器引发异常,例如在inproper消息等情况下。
(2)成功转换后(无异常)调用侦听器。然后,在侦听器中也可以抛出异常
现在,我想强调两件事:
(1')在转换器中导出时,不要重新获取消息。简单地说,向队列发送确认,并模拟一切正常。
(2')在这种情况下,默认设置是什么?当内部
spring rabbitmq引擎决定向队列发送确认时?它什么时候决定重新发出命令?是否有可能根据具体情况进行管理
我在文档中发现:
如果未启用重试且侦听器引发异常,则
默认情况下,将无限期重试传递。你可以修改这个
两方面的行为;将defaultRequeueRejected属性设置为false
将尝试零重新交付;或者,扔一个
AmqpRejectAndDontRequeueException发出消息应被删除的信号
拒绝。这是启用重试和
已达到最大传递尝试次数
例如,在依赖于侦听器中捕获的异常的情况下,我应该决定是否要像我所想的那样重新获取消息(只需从catch
AmqpRejectAndDontRequeueException
抛出)。我不确定这是否是一个好方法,这也是我询问您意见的原因。请阅读
该行为(主要)由ErrorHandler
控制
抛出一个MessageConversionException
-容器为大多数异常重新请求消息,但某些异常被认为是致命的。一般来说,如果消息无法转换,那么重新传递它是没有意义的
这一点在名为
从版本1.3.2开始,默认的ErrorHandler现在是一个ConditionalRejectingErrorHandler,它将拒绝(而不是重新查询)因无法恢复的错误而失败的消息:
o、 s.amqp…MessageConversionException
o、 s.messaging…MessageConversionException
o、 美国消息传递…MethodArgumentNotValidException
o、 美国消息传递…MethodArgumentTypeMismatchException
java.lang.NoSuchMethodException
java.lang.ClassCastException
当使用MessageConverter转换传入的消息负载时,可以抛出第一个。如果在映射到@RabbitListener方法时需要额外的转换,则转换服务可能会抛出第二个。如果侦听器中使用了验证(例如@Valid),并且验证失败,则可能会抛出第三个。如果入站消息转换为不适合目标方法的类型,则可能会引发第四个错误。例如,参数声明为Message,但收到Message
版本1.6.3中添加了第五个和第六个
您可以根据需要定制ErrorHandler
。而且很好的一点是,我可以覆盖ErrorHandler来管理发送(n)个确认。好的,谢谢。违约行为是合理的。requeue指队列末尾的pop消息和推送?否;rabbitmq requeues拒绝队列头的消息。因此,在类似情况下,我们可以循环。问题是其他(正确的)消息被阻止,因为它是FIFO。可能存在一些asn
消息存在的可能性?有一种技术可以使用-将失败的消息路由到DLQ,在DLQ上设置TTL,并使其死信过期的消息返回到原始队列。您可以检查x-death标头,查看它在循环中运行了多少次。有关更多信息,请参阅。好的,我读了一些关于可能的解决方案的文章。我现在可以看到两种方法:setdeath-x
header或DLX/DLQ方法。这一秒只需要rabbitmq
配置,不需要spring。在第二种解决方案中,被拒绝的消息被写入一些(比如)框中,并定期重新加入原始队列。被MessageConverterException
拒绝的couerse消息的个数将被删除,而不是移动到DLX。我认为DLX中的消息是永久存储的。但是,我应该使用什么方法?这第二个需要spring代码,并对消息的livecycle(n
Opportunities)提供完全控制,有关于它的链接吗?