我的Java应用程序向RabbitMQ交换发送消息,然后交换重定向消息到绑定队列。 我在RabbitMQ中使用Springframework AMQP java插件。
问题:消息进入队列,但它保持“未确认”状态,它永远不会变为“就绪”。
可能是什么原因?
答案 0 :(得分:16)
Unacknowledged消息暗示消费者已经读过消息,但是消费者从未向RabbitMQ代理发回ACK,表示已完成处理。
我对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:您将看到的构造函数可以设置{ {3}}并查看nextMessage()这将返回一个Message对象,其中包含一个名为getDeliveryTag()的方法,这将返回一个Long,它是您将在basicAck上发回的ID
答案 1 :(得分:8)