如何让WCF MSMQ一次获得10条以上的消息?

时间:2016-11-17 15:30:18

标签: .net wcf msmq

我已经以编程方式设置了msmq绑定和限制,但即使我指定MaxConcurrentCalls,MaxConcurrentSessions和MaxConcurrentInstances高于10,我也无法一次处理超过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。

1 个答案:

答案 0 :(得分:2)

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

在该设置的MSDN documentation的备注部分中显示:

  

在服务器环境(ASP.NET)中使用时,DefaultConnectionLimit默认为更高的连接数,即10。

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

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

ServicePointManager.DefaultConnectionLimit = 100; 

以上行应允许100个连接。