2016-11-17 50 views
1

我已经以编程方式设置了msmq绑定和限制,但即使我指定MaxConcurrentCalls,MaxConcurrentSessions和MaxConcurrentInstances高于10,我也无法一次处理超过10条消息。如何让WCF MSMQ每次获得10条以上的消息?

下面是代码来创建主机:

 var host = new ServiceHost(typeof(MqProcessRequestServer)); 
     var binding = new NetMsmqBinding(NetMsmqSecurityMode.None) 
     { 
      UseSourceJournal = true, 
      ReceiveErrorHandling = ReceiveErrorHandling.Drop, 
      ReceiveRetryCount = 0, 
      MaxRetryCycles = 0, 
      RetryCycleDelay = TimeSpan.FromMinutes(1), 
      ExactlyOnce = true, 
      Durable = true, 
      MaxReceivedMessageSize = 4000000000, 
      ReceiveTimeout = TimeSpan.FromSeconds(30) 
     }; 

     var queueUri = string.Format("net.msmq://localhost/private/{0}", scriptEngineVersion); 
     host.AddServiceEndpoint(typeof(IMqProcessRequest), binding, queueUri); 

     // Set throttling to ScriptEngine.Capacity in datamodel 
     var throttling = new ServiceThrottlingBehavior 
     { 
      MaxConcurrentCalls = capacity, 
      MaxConcurrentSessions = capacity, 
      MaxConcurrentInstances = capacity 
     }; 
     host.Description.Behaviors.Add(throttling); 

     // Set service timeout 
     var behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>(); 
     behavior.TransactionTimeout = TimeSpan.FromSeconds(60).ToString(); 

这里是服务行为:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerCall, ReleaseServiceInstanceOnTransactionComplete = false)] 
public class MqProcessRequestServer : IMqProcessRequest, IDisposable 

我已经尝试了不同的能力值,所有小于10个工作正常,因为我得到最多配置,但10以上将只有10个。

回答

2

您允许的10个连接是由默认的ServicePointManager.DefaultConnectionLimit引起的。

在关于MSDN documentation上,设置它备注部分表示:

当在服务器环境(ASP.NET)DefaultConnectionLimit默认用于更高数量的连接,这是10

在无服务器环境中,默认值为2.

为了允许在应用程序启动时设置更多连接,当应用程序加载时,DefaultConnectionLimit。

ServicePointManager.DefaultConnectionLimit = 100; 

上面的行应该允许100个连接。