异步 @RabbitListener
返回类型
@RabbitListener
(和 @RabbitHandler
)方法可以指定异步返回类型 CompletableFuture<?>
和 Mono<?>
,从而允许异步发送回复。ListenableFuture<?>
已不再支持,它已被 Spring Framework 弃用。
监听器容器工厂必须配置 AcknowledgeMode.MANUAL ,以便消费者线程不会确认(ack)消息;相反,异步完成将在异步操作完成后确认或否定确认(nack)消息。当异步结果完成时出现错误,消息是否重新入队取决于抛出的异常类型、容器配置以及容器错误处理器。默认情况下,消息将被重新入队,除非容器的 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
的规则仍然适用。类路径中必须存在 org.jetbrains.kotlinx:kotlinx-coroutines-reactor
依赖,以允许 suspend
函数调用。
同样从版本 3.0.5 开始,如果为具有异步返回类型(包括 Kotlin suspend 函数)的监听器配置了 RabbitListenerErrorHandler
,则在失败后会调用错误处理器。有关此错误处理器及其用途的更多信息,请参阅 异常处理。