异步 @RabbitListener
返回类型
@RabbitListener
Return Types
@RabbitListener
(以及 @RabbitHandler
)方法可以指定异步返回类型 CompletableFuture<?>
和 Mono<?>
,从而允许异步发送回复。ListenableFuture<?>
不再受支持;它已被 Spring 框架弃用。
监听器容器工厂必须配置为 AcknowledgeMode.MANUAL
,以便消费者线程不会确认消息;相反,异步操作完成时,异步完成会确认或拒绝消息。当异步结果以错误完成时,消息是否重新入队取决于抛出的异常类型、容器配置以及容器的错误处理程序。默认情况下,消息将重新入队,除非容器的 defaultRequeueRejected
属性设置为 false
(默认情况下为 true
)。如果异步结果以 AmqpRejectAndDontRequeueException
完成,则消息不会重新入队。如果容器的 defaultRequeueRejected
属性为 false
,你可以通过将 future 的异常设置为 ImmediateRequeueException
来覆盖此行为,消息将重新入队。如果监听器方法中发生某些异常,导致无法创建异步结果对象,则必须捕获该异常并返回适当的返回对象,该对象将导致消息被确认或重新入队。
从版本 2.2.21、2.3.13、2.4.1 开始,当检测到异步返回类型时,AcknowledgeMode
将自动设置为 MANUAL
。此外,带有致命异常的传入消息将被单独拒绝确认,而之前任何先前未确认的消息也会被拒绝确认。
从 3.0.5 版本开始,@RabbitListener
(以及 @RabbitHandler
)方法可以使用 Kotlin 的 suspend
标记,整个处理过程和回复生成(可选)将在相应的 Kotlin 协程中进行。所有关于 AcknowledgeMode.MANUAL
的规则仍然适用。为了允许 suspend
函数的调用,classpath 中必须存在 org.jetbrains.kotlinx:kotlinx-coroutines-reactor
依赖。
从版本 3.0.5 开始,如果在一个具有异步返回类型(包括 Kotlin 的挂起函数)的监听器上配置了 RabbitListenerErrorHandler
,则在发生故障后调用该错误处理程序。有关此错误处理程序及其用途的更多信息,请参阅处理异常。