1

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、チャネル プールからチャネルを返す直前も含めて、役に立ちませんでした。プリフェッチ サイズが受け入れられない理由はありますか?

ありがとう!

4

1 に答える 1

4

公式ドキュメントから

no-ack オプションが設定されている場合、prefetch-count は無視されます。

auto-ack消費者にフラグを使用しているようです。autoAck変数の値を確認してください。

于 2013-08-16T06:01:53.377 に答える