请使用 Spring AMQP 4.0.2(最新稳定版本)!spring-doc.cadn.net.cn

异步 @RabbitListener 返回类型

@RabbitListener(以及 @RabbitHandler)方法可以使用异步返回类型 CompletableFuture<?>Mono<?> 进行指定,从而允许回复异步发送。ListenableFuture<?> 已不再受支持;该功能已被 Spring 框架弃用。spring-doc.cadn.net.cn

监听器容器工厂必须配置为 AcknowledgeMode.MANUAL,以确保消费者线程不会确认消息;相反,异步完成时,将由异步操作在完成后确认或否定确认该消息。当异步结果以错误完成时,消息是否重新入队取决于所抛出的异常类型、容器配置以及容器错误处理器。默认情况下,消息将被重新入队,除非容器的 defaultRequeueRejected 属性设置为 false(默认值为 true)。如果异步结果以 AmqpRejectAndDontRequeueException 完成,则消息将不会被重新入队。如果容器的 defaultRequeueRejected 属性为 false,您可以通过将未来的异常设置为 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 依赖项必须存在于类路径中,以支持 suspend 函数调用。spring-doc.cadn.net.cn

自版本 3.0.5 起,如果在监听器上配置了 RabbitListenerErrorHandler(且其异步返回类型为非空),则在发生失败后会调用错误处理器。有关此错误处理器及其作用的更多信息,请参阅 处理异常spring-doc.cadn.net.cn