异步@RabbitListener返回类型

@RabbitListener(以及@RabbitHandler) 方法可以使用异步返回类型指定CompletableFuture<?>Mono<?>,让回复异步发送。ListenableFuture<?>不再受支持;它已被 Spring Framework 弃用。spring-doc.cadn.net.cn

侦听器容器工厂必须配置为AcknowledgeMode.MANUAL这样 Consumer 线程就不会确认消息;相反,异步完成将在异步作完成时对消息进行 ack 或 nack 处理。 当异步结果完成但出现错误时,消息是否重新排队取决于引发的异常类型、容器配置和容器错误处理程序。 默认情况下,消息将被重新排队,除非容器的defaultRequeueRejected属性设置为false(它是true默认情况下)。 如果异步结果以AmqpRejectAndDontRequeueException,则不会将消息重新排队。 如果容器的defaultRequeueRejectedproperty 为false,你可以通过将 future 的 exception 设置为ImmediateRequeueException,消息将被重新排队。 如果侦听器方法中发生某些异常,阻止创建异步结果对象,则必须捕获该异常并返回适当的返回对象,该对象将导致消息被确认或重新排队。

从版本 2.2.21、2.3.13、2.4.1 开始,AcknowledgeMode将自动设置MANUAL当检测到异步返回类型时。 此外,具有致命异常的传入消息将被单独否定确认,以前任何先前未确认的消息也会被否定确认。spring-doc.cadn.net.cn

从版本 3.0.5 开始,@RabbitListener(以及@RabbitHandler) 方法都可以使用 Kotlin 进行标记suspend整个处理过程和回复生成(可选)发生在相应的 Kotlin 协程上。 所有提到的规则AcknowledgeMode.MANUAL仍然适用。 这org.jetbrains.kotlinx:kotlinx-coroutines-reactor依赖项必须存在于 Classpath 中,才能允许suspend函数调用。spring-doc.cadn.net.cn

同样从版本 3.0.5 开始,如果RabbitListenerErrorHandler在具有异步返回类型(包括 Kotlin 挂起函数)的侦听器上配置,则会在失败后调用错误处理程序。 有关此错误处理程序及其用途的更多信息,请参阅处理异常spring-doc.cadn.net.cn