2017-04-19 12 views
0

現在の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個のメッセージを、そのプリフェッチバッファのように「トップアップ」するために消費者にさらにディスパッチする。

私はまた、唯一のQueuePrefetchor 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; 

最後のオプションとの違いについてはっきりとは分かりませんが、

答えて

1

非同期リスナーを使用しているため、非同期イベントリスナーへの各メッセージの配信時にクライアントがブローカにクレジットを付与し続けるため、ブローカにすべてが送信されます。任意の時点でクライアントに配信されるメッセージの量を真に制限するには、クライアントが同期受信呼び出しを使用する必要があります。個々のアクノレッジは、シンクロナイズされた消費量と最もよく似ています。これにより、読み込まれるメッセージの数を制御し、準備が整った時点でそれらを認識できるようになります。

個々の確認応答モードで最適化確認設定が適用されないため、パフォーマンスには役立ちません。

関連する問題