eingestellt Ich verwende die aktuelle Apache.NMS 1.7.1 und Apache.NMS.ActiveMQ 1.7.2. Ich benutze IndividualAcknowledge
, also versuche ich, die Anzahl der geladenen Nachrichten ziemlich niedrig zu halten, weil es sehr langsam wird, wenn >> 1000 Nachrichten geladen werden, ohne sie abzuhaken (es wird jedes Mal eine verknüpfte Liste aller Nachrichten durchsucht) .NMS ActiveMQ Ignoriert Prefetch Limit in Code
Ich habe folgende 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();
Die Warteschlange testQueue
enthält >> 20_000 Nachrichten. Nach dem Warten einige Sekunden, _collection
enthält alle Nachrichten, ohne dass ich eine von ihnen anerkenne. Wenn ich the dokumentation richtig verstehe, sollte ich höchstens 1000 bekommen, bis ich sie bestätige.
Sobald der Broker eine Prefetch-Grenze Anzahl der Nachrichten an einen Verbraucher noch mehr Nachrichten, die sie versenden nicht an diesen Verbraucher versandt hat, bis der Verbraucher mindestens 50% der vorab abgerufenen Nachrichten bestätigt hat, zB Prefetch/2, dass es erhalten hat. Wenn der Broker die Bestätigungen empfangen hat, wird er eine weitere Vorabruf-/2-Anzahl von Nachrichten an den Verbraucher senden, um sozusagen seinen Vorabrufpuffer "aufzufüllen".
Ich habe auch versucht, einige Variationen wie nur QueuePrefetch
or setting the policy in the url Einstellung:
activemq:tcp://localhost:61616?nms.prefetchPolicy.queuePrefetch=100
oder in the queue:
queue://testQueue?consumer.prefetchSize=100
In Bezug auf die Langsamkeit der IndividualAcknowledge
, ich habe bereits versucht, einige andere Optionen ohne viel Glück :
messageConsumer.OptimizeAcknowledge = true;
messageConsumer.OptimizeAcknowledgeTimeOut = 1000;
messageConsumer.OptimizedAckScheduledAckInterval = 500;
Obwohl ich nicht ganz klar über die Unterschiede der letzten Optionen bin.