跳到主要内容
版本:4.1.1

异步 @RabbitListener 返回类型

Doubao 中英对照 Asynchronous @RabbitListener Return Types

@RabbitListener(以及 @RabbitHandler)方法可以指定异步返回类型 CompletableFuture<?> 和 Mono<?>,从而让回复被异步发送。ListenableFuture<?> 不再受支持;它已被 Spring Framework 废弃。

important

监听器容器工厂必须配置为 AcknowledgeMode.MANUAL,这样消费线程就不会 ack 该消息;相反,当异步操作完成时,由异步完成来 ack 或 nack 该消息。当异步结果以错误完成时,消息是否被重新入队取决于抛出的异常类型、容器配置以及容器错误处理器。默认情况下,消息会被重新入队,除非容器的 defaultRequeueRejected 属性被设为 false(默认为 true)。如果异步结果以 AmqpRejectAndDontRequeueException 完成,消息将不会被重新入队。如果容器的 defaultRequeueRejected 属性为 false,你可以通过将 future 的异常设为 ImmediateRequeueException 来覆盖该行为,消息就会被重新入队。如果监听器方法内部发生了某个异常、阻止了异步结果对象的创建,你必须捕获该异常并返回一个合适的返回对象,使消息被确认或重新入队。

从 2.2.21、2.3.13、2.4.1 版开始,当检测到异步返回类型时,AcknowledgeMode 会被自动设为 MANUAL。此外,带有致命异常的入站消息会被单独地 nack;而在此之前,任何此前未确认的消息也会一起被 nack。

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

同样从 3.0.5 版开始,如果在带有异步返回类型(包括 Kotlin suspend 函数)的监听器上配置了 RabbitListenerErrorHandler,则在失败之后会调用该错误处理器。有关此错误处理器及其用途的更多信息,请参阅处理异常。