2017-04-19 6 views
0

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 QueuePrefetchor 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.

Antwort

1

Da Sie einen asynchronen Listener verwenden, wird der Broker Ihnen alles senden, da der Client weiterhin dem Broker bei der Zustellung jeder Nachricht an Ihren asynchronen Ereignis-Listener Kredit gewährt. Um die Anzahl der zu einem bestimmten Zeitpunkt an den Client zu liefernden Nachrichten wirklich zu begrenzen, muss der Client synchrone Empfangsaufrufe verwenden. Die individuelle Bestätigung ist am besten mit synchronem Verbrauch gekoppelt, so dass Sie steuern können, wie viele Nachrichten gelesen werden, und sie zu einem bestimmten Zeitpunkt bestätigen, wenn sie bereit sind.

Die optimierten Bestätigungseinstellungen gelten nicht im individuellen Bestätigungsmodus, so dass die Leistung nicht verbessert wird.