如何在Spring AMQP中使用反应性RabbitListener进行确认/否定?

时间:2019-05-21 05:03:44

标签: spring spring-boot spring-amqp project-reactor spring-rabbitmq

我正在使用Spring AMQP 2.1.6来消费消息,其中RabbitListener返回Mono<Void>。例如:

@RabbitListener
public Mono<Void> myListener(MyMessage myMessage) {
    Mono<Void> mono = myService.doSomething(myMessage);
    return mono;
}

阅读documentation时说:

  

必须使用AcknowledgeMode.MANUAL配置侦听器容器工厂,以便使用者线程不会确认该消息。相反,异步完成将在异步操作完成时确认或拒绝消息。

因此,我为容器工厂配置了AcknowledgeMode.MANUAL,但是我不清楚“异步操作完成后异步完成是对消息的确认还是否定”意味着这是由{{1 }}本身还是我必须要做的事情?即调用spring-amqp之后我是否必须确认/否定消息,还是因为我返回了myService.doSomething(myMessage)(即使设置了Mono),Spring AMQP还是会自动确认消息?

如果需要手动发送确认或拒绝通知,那么在使用AcknowledgeMode.MANUAL时以非阻塞方式进行此操作的惯用方式是什么?

1 个答案:

答案 0 :(得分:2)

Mono完成时,侦听器适配器负责确认。

请参见AbstractAdaptableMessageListener.asyncSuccess()asyncFailure()

编辑

我不是反应堆人员,但据我所知,完成Mono<Void>并没有任何作用,因此永远不会调用on...()方法。

您可以使用channel.basicAckbasicReject ...来手动确认传递。

@RabbitListener(queues = "foo")
public void listen(String in, Channel channel,
        @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
    ...
}