【问题标题】:RabbitMQ prefetch ignored when consumer is Down and gets Up当消费者关闭并起床时,RabbitMQ 预取被忽略
【发布时间】:2015-09-01 23:27:22
【问题描述】:

当消费者下降时,我的 basicQos 被忽略,之后消费者起床。例如,假设消费者已关闭,并且来自生产者的 5 条消息到达。如果消费者没有运行,如果交换器/队列是持久的,这些消息将存储在磁盘中(我认为!)。

如果我将 basicQos 设置为 channel.basicQos(0, 3, true),我的消费者在 UP 时会收到超过 3 条消息。为什么?!?

另一方面,如果消费者在从队列接收消息时正在运行,则一切正常(仅从队列中读取 3 条消息)...我的代码如下:

factory = new ConnectionFactory();
factory.setHost(mRabbitMQHost); //may get server address from file configuration.
factory.setUsername(mRabbitMQUsername); 
factory.setPassword(mRabbitMQPassword);
connection = factory.newConnection();
channel = connection.createChannel();

channel.exchangeDeclare("exchangeName", "direct", true); //True enables durability
consumer = new QueueingConsumer(channel);

for (QGQueues queue : QGQueues.values()) {
    String queueName = queue.getQueueName();
    channel.queueDeclare(queueName, true, false, false, null);
    channel.queueBind(queueName, "exchangeName", queue.getRoutingKey());
    channel.basicConsume(queueName, false, consumer); //false enables ACK message to RabbitMQ server    
}

channel.basicQos(0, 3, true);

谢谢!

【问题讨论】:

  • 也许我解决了这个问题。 basicQos 必须在定义消费者之前调用。

标签: rabbitmq prefetch consumer


【解决方案1】:

我敢打赌,您需要先设置 QoS,然后再执行其他任何操作。

将您的代码更改为以下顺序:



channel = connection.createChannel();

// set QoS immediately
channel.basicQos(0, 3, true);

channel.exchangeDeclare("exchangeName", "direct", true); //True enables durability
consumer = new QueueingConsumer(channel);

for (QGQueues queue : QGQueues.values()) {
    String queueName = queue.getQueueName();
    channel.queueDeclare(queueName, true, false, false, null);
    channel.queueBind(queueName, "exchangeName", queue.getRoutingKey());
    channel.basicConsume(queueName, false, consumer); //false enables ACK message to RabbitMQ server    
}

这将确保在您尝试使用任何消息之前设置预取限制。

【讨论】:

  • 谢谢,德里克!这正是解决方案!
  • 是的,basicQos 是在告诉 RabbitMQ 消费者期望如何接收消息,所以必须在 basicConsume 之前发送
猜你喜欢
  • 1970-01-01
  • 2019-12-13
  • 2016-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-02
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多