NMS ActiveMQ忽略代码中设置的预取限制

时间:2017-04-19 18:26:19

标签: c# performance activemq nms

我使用的是当前的Apache.NMS 1.7.1和Apache.NMS.ActiveMQ 1.7.2。 我正在使用IndividualAcknowledge,因此我尝试将加载的邮件数量保持在相当低的水平,因为如果我在没有Acking的情况下加载了>> 1000条消息,它会变得非常慢他们(每次都在搜索所有邮件的链接列表)。

我有以下代码片段:

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包含&gt;&gt; 20_000条消息。等待几秒钟后,_collection包含所有消息,而我不承认任何消息。

如果我理解the dokumentation,我应该最多获得1000,直到我开始承认它们。

  

一旦代理向消费者发送了预取限制数量的消息,它将不再向该消费者发送任何消息,直到消费者已经确认至少50%的预取消息(例如prefetch / 2)为止。当经纪人收到所述确认后,它将向消费者发送另一个预取/ 2号消息,以便充当其预取缓冲区。

我还尝试了一些变体,例如只设置QueuePrefetch or 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 个答案:

答案 0 :(得分:1)

由于您正在使用异步侦听器,因此在向异步事件侦听器传递每条消息时,客户端会继续向代理授予信用,因此将向代理发送所有内容。要在任何给定时间真正限制传递给客户端的消息量,客户端需要使用同步接收呼叫。单个确认最好与同步消耗配对,这样您就可以控制读取的消息数量,并在准备好的某个时间点对它们进行确认。

优化的确认设置不适用于单独的确认模式,因此无法提高性能。