一尘不染

RabbitMQ:消息保持“未确认”

java

我的Java应用程序将消息发送到RabbitMQ交换,然后交换将消息重定向到绑定队列。我将RabbitMQ与Springframework AMQP
java插件一起使用。

问题:消息进入队列,但消息始终处于“未确认”状态,永远不会变为“就绪”状态。

可能是什么原因?


阅读 632

收藏
2020-12-03

共1个答案

一尘不染

一条未确认的消息表示您的使用者已经读取了该消息,但是该使用者从未将ACK发送回RabbitMQ代理以表示它已完成处理。

我不太熟悉Spring
Framework插件,但是(对于您的使用者)您将在某个地方声明队列,它可能看起来像这样(摘自http://www.rabbitmq.com/tutorials/tutorial-
two -java.html):

channel.queueDeclare(queueName, ....)

然后您将设置您的消费者

bool ackMode = false;
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(queueName, ackMode, consumer);

上面的ackMode是一个布尔值,通过将其设置为false,我们明确地向RabbitMQ表示我的使用者将确认收到的每个消息。如果将此标志设置为true,那么您将不会在RabbitMQ中看到未确认的计数,而是一旦使用者读取了该消息(即,该消息已传递给使用者,它将从队列中删除)。

要确认一条消息,您可以执行以下操作:

QueueingConsumer.Delivery delivery = consumer.nextDelivery();
//...do something with the message...
channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); //the false flag is to do with multiple message acknowledgement

如果您可以发布一些消费者代码,那么我也许可以提供进一步的帮助…但是与此同时,请专门查看BlockingQueueConsumer:该构造函数将使您看到可以设置AcknowledgeMode并查看nextMessage()将返回一个Message对象,其中包含一个名为getDeliveryTag()的方法,该方法将返回Long,这是您将在basicAck上发送回的ID

2020-12-03