RabbitMQ的:消息保持“待处理财产损溢”(RabbitMQ: messages remain

2019-07-30 22:41发布

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

问题:消息来排队,但停留在“待处理财产损溢”状态,它永远不会变为“就绪”。

可能是什么原因?

Answer 1:

未确认的消息,意味着它已经被你的消费者阅读,但消费者从来没有发回ACK到RabbitMQ的经纪人说,处理完它。

我不是太熟悉Spring框架插件,但地方(你的客户),你会被你的申报队列,它可能看起来像这样(摘自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()这将返回包含一个名为getDeliveryTag()的方法,这将返回一个长,这是你会送回到了basicAck ID的消息对象



Answer 2:

我想补充我的2美分另一个可能的原因留在未确认状态的消息,即使消费者确保使用basicAck方法 -

一个进程的一个开放的RabbitMQ连接保持运行,有时多个实例,其中一个可能会导致消息卡住未确认状态,防止消费者的另一个实例不断重新获取此消息。

您可以访问的RabbitMQ管理控制台(对于本地机器,这应该是可以在本地主机:15672),并检查多个实例是否获得信道的保持,或者如果只有一个实例是当前活动:

查找冗余运行的任务(在这种情况下 - 爪哇),并终止它。 去除恶意进程后,你应该可以看到消息跳到就绪状态一次。



文章来源: RabbitMQ: messages remain “Unacknowledged”