2017-04-19 1 views
0

현재 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 :

은 또한 단지 QueuePrefetchor setting the policy in the url 설정과 같은 몇 가지 변화를 시도 :

messageConsumer.OptimizeAcknowledge = true; 
messageConsumer.OptimizeAcknowledgeTimeOut = 1000; 
messageConsumer.OptimizedAckScheduledAckInterval = 500; 

옵션에 대한 마지막 차이점에 대해서는 완전히 명확하지 않지만.

답변

1

비동기 수신기를 사용하고 있기 때문에 클라이언트가 비동기 이벤트 수신기에 각 메시지를 전달할 때 브로커에게 계속 크레딧을 부여하기 때문에 브로커에게 모든 메시지가 전송됩니다. 주어진 시간에 클라이언트에게 전달되는 메시지의 양을 진정으로 제한하려면 클라이언트는 동기 수신 호출을 사용해야합니다. 개별 승인은 동시 소비와 쌍을 이루며 가장 많은 수의 메시지를 읽을 수 있도록 제어하고 준비가되면 특정 시점에이를 확인합니다.

최적화 된 확인 설정은 개별 확인 모드에 적용되지 않으므로 성능에 도움이되지 않습니다.