【问题标题】:RabbitMQ Prefetch IgnoredRabbitMQ 预取被忽略
【发布时间】:2013-08-16 01:37:42
【问题描述】:

我遇到了一个问题,将basic.qos 设置为1 没有达到预期的效果 - 大量消息仍被推送给我的消费者。

我的代码看起来有点像这样:

    Channel channel = getChannel("pollQueuePassive"); // from our own channel pool implementation

    try{
        channel.queueDeclarePassive(queue.name);
    } catch (IOException e){
        channel = getChannel("pollQueueActive");
        channel.queueDeclare(queue.name, true, false, false, null);
    }

    channel.basicQos(1);

    QueueingConsumer consumer = new QueueingConsumer(channel);
    channel.basicConsume(queue.name, autoAck, consumer);

    while (!stopPolling()) { 
        try{
              QueueingConsumer.Delivery delivery = consumer.nextDelivery();
              String message = new String(delivery.getBody());

              boolean workResult = doWork(message);
              if(!autoAck) {
                  if(workResult) 
                      channel.basicAck(delivery.getEnvelope().getDeliveryTag(), true);
                  else
                      channel.basicNack(delivery.getEnvelope().getDeliveryTag(), false, true);
              }

            } catch (InterruptedException e) {}
    }

    closeConnection();

一旦我开始以这种方式从队列中消费,队列中的所有消息(在某​​些情况下超过 20,000 条)几乎都会立即传递给消费者。由于我想将队列中的消息同时分发给几十个消费者,这种行为显然是不可取的。我一直在尝试移动我的basic.qos 声明 - 包括在从我们的频道池返回频道之前 - 无济于事。任何想法为什么不遵守预取大小?

谢谢!

【问题讨论】:

    标签: java rabbitmq messaging amqp


    【解决方案1】:

    From official doc:

    如果设置了 no-ack 选项,则忽略预取计数。

    看起来您正在为您的消费者使用auto-ack 标志。请务必检查autoAck 变量的值。

    【讨论】:

    • 啊,我忘了检查堆栈中更靠前的autoAck 的值。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-26
    • 2016-06-05
    • 2014-02-25
    相关资源
    最近更新 更多