Java 如何知道消息是否已确认/未确认?

Java 如何知道消息是否已确认/未确认?,java,spring-boot,rabbitmq,spring-rabbit,Java,Spring Boot,Rabbitmq,Spring Rabbit,我试图通过RabbitMQ和Spring Boot知道消息何时被接受(ack)或不接受(nack) 我想(通过exchange)将消息发送到队列中,并检查队列是否已接受消息。实际上,我想发送到两个不同的队列,但这并不重要,我假设如果对其中一个有效,那么对另一个也有效 因此,我使用CorrelationData尝试了类似的方法: 公共布尔发送消息(…){ CorrelationData cd=新的CorrelationData(); this.rabbitmplate.convertAndSend

我试图通过RabbitMQ和Spring Boot知道消息何时被接受(ack)或不接受(nack)

我想(通过exchange)将消息发送到队列中,并检查队列是否已接受消息。实际上,我想发送到两个不同的队列,但这并不重要,我假设如果对其中一个有效,那么对另一个也有效

因此,我使用
CorrelationData
尝试了类似的方法:

公共布尔发送消息(…){ CorrelationData cd=新的CorrelationData(); this.rabbitmplate.convertAndSend(交换、路由密钥、消息、cd); 试一试{ 返回cd.getFuture().get(3,TimeUnit.SECONDS.isAck(); }捕获(InterruptedException | ExecutionException | TimeoutException e){ e、 printStackTrace(); 返回false; } } 行
cd.getFuture().get(3,TimeUnit.SECONDS).isAck()
应该得到
false
是值没有被
ack
放入队列。但这总是正确的,即使
routingKey
不存在。
因此,我假设这段代码正在检查消息是否已发送到
exchange
,并且
exchange
会说“是的,我已收到消息,它尚未路由,但我已收到”

因此,我在Rabbit/Spring文档中寻找了其他方法,但我没有找到方法

再解释一下,我想说的是:

在Spring引导代码中,我收到一条消息。此消息必须发送到其他队列/exchange,但在其他两个队列确认确认确认之前,无法从当前队列中删除(即确认)

我有手动确认,作为一个小伪代码,我有:

@RabbitListener(队列={queue})
public void receiveMessageFromDirect(消息消息、频道、,
@标题(AmqpHeaders.DELIVERY_标记)长标记){
布尔sendQueue1=sendMessage(…);
布尔sendQueue2=sendMessage(…);
if(sendQueue1&&sendQueue2){
//两条消息都已读取;现在我可以确认此消息
channel.basicAck(标签,假);
}否则{
//nacked;我无法删除该消息
channel.basicNack(标记、假、真);
}

我已经测试了这个结构,即使队列不存在,
sendQueue1
sendQueue2
的值总是正确的。

确认是正确的;即使对于无法发送的消息(我不完全确定为什么)

您需要启用返回的消息(并在将来完成-
CorrelationData.getReturnedMessage()
后,在
CorrelationData
中检查它是否为null)。如果它不为null,则消息无法路由到任何队列


只有当代理中存在bug,或者使用的队列具有
x-max-length
和溢出行为
reject publish

时,您才能获得nack。非常感谢您的回答。因此,即使我手动执行
nack
,行
getFuture()…isAck()
将为真?生产者和消费者之间没有连接;它们完全解耦;生产者端的ack只是消息是否由代理接收;消费者端的ack/nack是消费者是否成功接收消息;没有与生产者的通信。消息传递系统在设计上是这样解耦的。消费者端的第三个参数告诉代理是重新获取(并重新传递)消息还是丢弃消息(或者将消息路由到DLQ,如果这样配置的话)。