현재 Apache.NMS 1.7.1 및 Apache.NMS.ActiveMQ 1.7.2를 사용하고 있습니다. IndividualAcknowledge
을 사용하고 있으므로로드 된 메시지의 수를 상당히 낮게 유지하려고합니다. 메시지를 적게하지 않고로드 된 >> 1000 메시지가 있으면 (실제로는 모든 메시지의 링크 된 목록을 검색 중입니다) .NMS ActiveMQ가 코드에서 프리 페치 제한을 무시합니다.
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 메시지 :
나는 다음과 같은 codesnippets 있습니다. 잠시 기다린 후 _collection
에는 아무 것도 알려주지 않고 모든 메시지가 포함되어 있습니다.
내가 the dokumentation을 올바르게 이해했다면, 내가 인정하기 시작할 때까지 최대 1000 개를 받아야합니다.
브로커가 예를 들어 소비자가 프리 페치 된 메시지의 50 % 이상을 인정했다 때까지 그 소비자에게 더 이상 메시지를 전달하지 않습니다 소비자, 메시지의 프리 페치 제한 번호를 발송하면, 프리 페치/2, 그것이받은. 브로커가 상기 확인 응답을 수신하면, 프리 페치/2 개의 추가 메시지를 소비자에게 프리 - 업 (prefetch) 버퍼로서 '상향식 (top-up)'으로 발송할 것이다. , 이미 많은 행운없이 여러 가지 다른 옵션을 시도
IndividualAcknowledge
의 느림에 관한queue://testQueue?consumer.prefetchSize=100
:
activemq:tcp://localhost:61616?nms.prefetchPolicy.queuePrefetch=100
또는 in the queue :
은 또한 단지 QueuePrefetch
or setting the policy in the url 설정과 같은 몇 가지 변화를 시도 :
messageConsumer.OptimizeAcknowledge = true;
messageConsumer.OptimizeAcknowledgeTimeOut = 1000;
messageConsumer.OptimizedAckScheduledAckInterval = 500;
옵션에 대한 마지막 차이점에 대해서는 완전히 명확하지 않지만.