【问题标题】:RabbitMQ: messages remain "Unacknowledged"RabbitMQ:消息保持“未确认”
【发布时间】:2017-03-26 16:44:34
【问题描述】:

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

问题:消息进入队列,但它停留在“Unacknowledged”状态,它永远不会变成“Ready”。

可能是什么原因?

【问题讨论】:

    标签: java message-queue rabbitmq amqp


    【解决方案1】:

    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 中看到 Unacknowledged 计数,而是在消费者读取消息后立即(即它已交付给消费者,它将从队列中删除)。

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

    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

    【讨论】:

      【解决方案2】:

      只是为了让消息保持未确认状态的另一个可能原因加上我的 2 美分,即使消费者确保使用 basicAck 方法-

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

      您可以访问 RabbitMQ 管理控制台(对于本地计算机,这应该在 localhost:15672 可用),并检查是否有多个实例占用了通道,或者当前是否只有一个实例处于活动状态:

      找到多余的正在运行的任务(在本例中为 java)并终止它。移除恶意进程后,您应该会看到消息再次跳转到就绪状态。

      【讨论】:

      • 这个答案真是太棒了。我被困在这个问题上,不知道为什么几分钟前我的消息被完美地传递,然后为什么在我重新启动我的 mac 后它们没有传递。你知道为什么会这样吗?
      • 只是想在上面补充一下,这就是发生在我身上的事情。我试图从管理控制台查看队列中的消息,由于某种原因,该页面从未加载,并且消息被卡在未确认的状态。我希望他们会在一夜之间超时,但他们没有。上述建议引导我找到与我的用户的开放连接。一旦我强制关闭,消息都恢复就绪。谢天谢地,这些消息并不重要,因此延迟无关紧要。但是,从中恢复是很有价值的信息。
      猜你喜欢
      • 2015-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2015-12-19
      • 1970-01-01
      • 1970-01-01
      • 2019-02-04
      相关资源
      最近更新 更多