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