当前位置: 首页 > 面试题库 >

RabbitMQ:消息保持“未确认”

聂奇
2023-03-14
问题内容

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



 类似资料:
  • 好吧,我不需要详细介绍我设置的整个系统, 我遇到的问题是,当使用者取消(amqpchannel->basic_cancel)对队列的监听时,会留下一个额外的消息未被这个工作者确认。它也不会触发正常的回调来处理此消息。 队列正在阻塞(使用wait) 预取为1,这是您所能拥有的最小值 使用者可以动态侦听() 使用者可以动态忘记() 我不会告诉给定使用者使用或取消给定队列的确切方式。但这一切都是完美的工

  • 以前我读取队列中的所有消息,但现在我必须根据用户的选择返回特定数量的消息(计数)。 我试着相应地改变for循环,但是由于自动应答,它读取了所有的消息。所以我尝试在配置文件中将它改为手动。 在我的程序中,如何在读取 msg 后手动确认消息(目前我正在使用 AmqpTemplate 接收,我没有频道的参考)? 任何帮助都是非常值得赞赏的,提前表示感谢。

  • 我将不折不扣地学习以下教程:https://www.rabbitmq.com/tutorials/tutorial-two-java.html。 我以这样的方式启动RabbitMQ服务器: 我生成了两个消费者,当我Ctrl+C其中一个时,另一个正在运行的消费者不会接收到最初发往前一个消费者的消息。如何在Ctrl+C'ing从一个消费者中重新传递消息? 编辑:我现在正在通过'brew'安装Rabbi

  • 发布确认原理 生产者将信道设置成 confirm 模式,一旦信道进入 confirm 模式,所有在该信道上的消息都会被指派一个唯一的 ID(从一开始),一旦消息被投递到所有匹配的队列后,broker 就会发送一个确认给生产者(包含消息的唯一ID),这就使得生产者知道消息已经正确到达目的队列了 如果消息和队列是持久化的,那么确认消息会在将消息写入磁盘后发出,broker 回传给生产者的确认消息中 ,

  • 在队列选项卡的rabbitMQ web界面上,我看到了“概述”面板,我在其中找到了以下内容: 排队消息: 准备好了 未确认 总数 我猜“总数”是多少。但什么是“准备就绪”和“未确认”?“准备好了”——传递给消费者的信息?“未确认”-? 消息费率: 发表 交付 重新交付 承认 这些信息是什么?尤其是“重新交付”和“确认”?这是什么意思?

  • 本文向大家介绍RabbitMQ 怎么保证消息的稳定性?相关面试题,主要包含被问及RabbitMQ 怎么保证消息的稳定性?时的应答技巧和注意事项,需要的朋友参考一下 提供了事务的功能。 通过将 channel 设置为 confirm(确认)模式。