我的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