Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向中的rabbitmq服务器发送确认取决于转换器和侦听器_Java_Spring Boot_Spring Amqp_Spring Rabbit - Fatal编程技术网

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。可能存在一些as
n
消息存在的可能性?有一种技术可以使用-将失败的消息路由到DLQ,在DLQ上设置TTL,并使其死信过期的消息返回到原始队列。您可以检查x-death标头,查看它在循环中运行了多少次。有关更多信息,请参阅。好的,我读了一些关于可能的解决方案的文章。我现在可以看到两种方法:set
death-x
header或DLX/DLQ方法。这一秒只需要
rabbitmq
配置,不需要spring。在第二种解决方案中,被拒绝的消息被写入一些(比如)框中,并定期重新加入原始队列。被
MessageConverterException
拒绝的couerse消息的个数将被删除,而不是移动到DLX。我认为DLX中的消息是永久存储的。但是,我应该使用什么方法?这第二个需要spring代码,并对消息的livecycle(
n
Opportunities)提供完全控制,有关于它的链接吗?