Java 如何知道消息是否已确认/未确认?
我试图通过RabbitMQ和Spring Boot知道消息何时被接受(ack)或不接受(nack) 我想(通过exchange)将消息发送到队列中,并检查队列是否已接受消息。实际上,我想发送到两个不同的队列,但这并不重要,我假设如果对其中一个有效,那么对另一个也有效 因此,我使用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
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,如果这样配置的话)。