2013-08-16 32 views
1

我遇到了一個問題,其中設置basic.qos1沒有達到預期的效果 - 大量郵件仍然推送給我的客戶。RabbitMQ Prefetch Ignored

我的代碼看起來有點像這樣:

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(); 

當我開始從隊列中隊列中的消費以這種方式,所有消息(向上20000,在某些情況下)幾乎是即時交付給消費者。由於我希望將隊列中的消息同時分發給數十個消費者,因此這種行爲顯然是不可取的。我一直在推動我的basic.qos宣言 - 包括在從我們的頻道池返回頻道之前 - 無濟於事。任何想法爲什麼預取大小不會被尊重?

謝謝!

回答

3

From official doc

如果沒有ACK選項設置預取數被忽略。

看起來像你正在使用auto-ack標誌爲您的消費者。爲了確保檢查autoAck變量的值。

+0

啊,我忘了檢查'autoAck'的值進一步堆棧。謝謝。 –