Asynchronous @RabbitListener
Return Types
@RabbitListener
(和 @RabbitHandler
)方法可以用异步返回类型 CompletableFuture<?>
和 Mono<?>
指定,允许异步发送回复。ListenableFuture<?>
不再受支持;它已被 Spring Framework 弃用。
侦听器容器工厂必须配置为 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
的所有提及规则仍然适用。org.jetbrains.kotlinx:kotlinx-coroutines-reactor
依赖项必须存在于类路径中,以允许 suspend
函数调用。
同样地,从 3.0.5 版本开始,如果已在具有异步返回类型的侦听器上配置了 RabbitListenerErrorHandler
,则在出现故障后会调用错误处理程序。请参阅 Handling Exceptions以详细了解该错误处理程序及其用途。