异步 @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 suspend 函数)的侦听器配置了 RabbitListenerErrorHandler,则错误处理器会在失败后被调用。有关此错误处理器及其用途的更多信息,请参阅处理异常。