現在のApache.NMS 1.7.1とApache.NMS.ActiveMQ 1.7.2を使用しています。 IndividualAcknowledge
を使用していますので、読み込まれたメッセージの数を非常に低く抑えようとしています。なぜなら、1000個のメッセージを読み込まずに読み込んだ場合(実際にはすべてのメッセージのリンクされたリストを検索しています) 。NMS ActiveMQはコードでプリフェッチ制限を無視します
私は、次のcodesnippetsがあります
BlockingCollection<IMessage> _collection = new BlockingCollection<IMessage>();
var factory = new ConnectionFactory("activemq:tcp://localhost:61616");
var _connection = (Connection) factory.CreateConnection();
_connection.PrefetchPolicy.All = 1000;
var session = (Session) _connection.CreateSession(AcknowledgementMode.IndividualAcknowledge);
var destination = SessionUtil.GetDestination(session, "queue://testQueue");
var messageConsumer = (MessageConsumer)session.CreateConsumer(destination);
messageConsumer.Listener += message => _collection.Add(message);
_connection.Start();
キューtestQueue
は>> 20_000メッセージが含まれています。数秒待ってから、_collection
にすべてのメッセージが含まれています。
私がthe dokumentationを正しく理解していれば、私がそれらを認め始めるまで、私は最大1000人になるはずです。
ブローカーは例えば、プリフェッチ/ 2、消費者がプリフェッチされたメッセージの少なくとも50%を認識するまでそれが消費者に任意のより多くのメッセージをディスパッチしません消費者へのメッセージのプリフェッチ制限数を派遣していたら、受け取ったブローカが前記肯定応答を受信すると、そのプリフェッチ/ 2個のメッセージを、そのプリフェッチバッファのように「トップアップ」するために消費者にさらにディスパッチする。
私はまた、唯一のQueuePrefetch
or setting the policy in the urlを設定するようないくつかのバリエーションを試みた:
activemq:tcp://localhost:61616?nms.prefetchPolicy.queuePrefetch=100
またはin the queue:
queue://testQueue?consumer.prefetchSize=100
IndividualAcknowledge
の遅さについては、私はすでに多くの幸運ことなく、いくつかの他のオプションを試してみました:
messageConsumer.OptimizeAcknowledge = true;
messageConsumer.OptimizeAcknowledgeTimeOut = 1000;
messageConsumer.OptimizedAckScheduledAckInterval = 500;
最後のオプションとの違いについてはっきりとは分かりませんが、