RabbitMQ:消息保持“未确认”
我的Java应用程序将消息发送到RabbitMQ交换,然后交换将消息重定向到绑定队列。我将RabbitMQ与Springframework AMQP
java插件一起使用。
问题:消息进入队列,但消息始终处于“未确认”状态,永远不会变为“就绪”状态。
可能是什么原因?
回答:
一条未确认的消息表示您的使用者已经读取了该消息,但是该使用者从未将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
以上是 RabbitMQ:消息保持“未确认” 的全部内容, 来源链接: utcz.com/qa/419260.html