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