我正在使用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
时以非阻塞方式进行此操作的惯用方式是什么?
答案 0 :(得分:2)
Mono完成时,侦听器适配器负责确认。
请参见AbstractAdaptableMessageListener.asyncSuccess()
和asyncFailure()
。
编辑
我不是反应堆人员,但据我所知,完成Mono<Void>
并没有任何作用,因此永远不会调用on...()
方法。
您可以使用channel.basicAck
或basicReject
...来手动确认传递。
@RabbitListener(queues = "foo")
public void listen(String in, Channel channel,
@Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
...
}