接上文,可设置并发数的版本

    public abstract class MessageQueueConcurrentHandlerBase<T> : IMessageQueueHandler
    {
        public MessageQueueConcurrentHandlerBase(string queueName, int maxConcurrency)
        {

if (!MessageQueue.Exists(queueName))
                throw new Exception(string.Format("No such a queue: {0}", queueName));
            if (maxConcurrency < 1)
                throw new ArgumentOutOfRangeException("maxConcurrency");


            this._queueName = queueName;
            this._pool = new Semaphore(0, maxConcurrency);
        }

        public void StartRead()
        {
            this._queue = new MessageQueue(this._queueName) { Formatter = new XmlMessageFormatter(new Type[] { typeof(long) }) };
            this._queue.PeekCompleted += new PeekCompletedEventHandler(Produce);
            this._queue.BeginPeek();
        }

        public override string ToString()
        {
            return string.Format("{0}_{1}", this._queueName, this.ProcessName);
        }

        public int WorkerCount { get { return Thread.VolatileRead(ref this._workerCount); } }

        protected abstract string ProcessName { get; }

        protected abstract void MainProcess(T backThreadId);

        protected void LogInfo(string msg)
        {
            EntLibLogger.WriteLogFile(msg);
        }

        #region private
        private void Produce(object sender, PeekCompletedEventArgs e)
        {
            while (true)
            {
                this._pool.WaitOne();

                var message = this._queue.EndPeek(e.AsyncResult);
                T backThreadId = (T)message.Body;

                ThreadPool.QueueUserWorkItem(new WaitCallback(Consume), backThreadId);

                this._queue.Receive();
                this._queue.BeginPeek();

                this._pool.Release();
            }
        }

        private void Consume(object stateInfo)
        {
            T messageItem = (T)stateInfo;
            this.LogInfo(string.Format("{0} - Received a message, MessageItem = {1}", this.ProcessName, messageItem));
            Interlocked.Increment(ref this._workerCount);

            try
            {
                this.LogInfo(string.Format("{0} - Running - {1}, WorkerCount = {2}", this.ProcessName, messageItem, this.WorkerCount));
                MainProcess(messageItem);
            }
            catch (Exception ex)
            {
                this.HandleException(ex, messageItem);
            }
            finally
            {
                Interlocked.Decrement(ref this._workerCount);

                this.LogInfo(string.Format("{0} - Over - {1}, WorkerCount = {2}", this.ProcessName, messageItem, this.WorkerCount));
            }
        }

        private void HandleException(Exception ex, T messageItem)
        {
            this.LogInfo(string.Format("Exception in {0}:[Message]={1},[StackTrace]={2},[Type]={3},[_workerCount]={4},[backThreadId]={5}", this.ProcessName, ex.Message, ex.StackTrace, ex.GetType(), this.WorkerCount, messageItem));
        }

        private readonly string _queueName;
        private MessageQueue _queue;
        private int _workerCount;
        private Semaphore _pool;
        #endregion
    }
时间: 2024-10-28 17:01:58

接上文,可设置并发数的版本的相关文章

使用测试工具时候如何计算设置并发数?

方法论-1: 同时在线用户数:平均并发数:并发用户数峰值: 在实际的性能测试工作中,测试人员一般比较关心的是业务并发用户数,也就是从业务角度关注究竟应该设置多少个并发数比较合理,因此,在后面的讨论中,也是主要针对业务并发用户数进行讨论,而且,为了方便,直接将业务并发用户数称为并发用户数. (1)  计算平均的并发用户数: C = nL/T                     即:平均并发数=总用户数*用户在线时长/总工作时间 (2)  并发用户数峰值: C’ ≍ C+3*SQRT(C) 即:

IIS Express并发数设置

今天将之前的一个瓦片图的服务迁移到了asp.net core试了一下,使用的时候感觉客户端刷新时有些慢,估计是并发连接数限制的原因. 由于这是一个开发中的版本,是用IIS Express部署的,IIS的并发连接数设置我倒是知道,但又懒的将其部署到iis上,便道网上搜索了一下IIS Express的并发数连接限制的修改方法. 找了一下,在StackOverFlow的一篇帖子Configure Maximum Number of Requests in IIS Express介绍了修改方案,步骤如下

apache限制并发数,IP,带宽设置

给大家推荐两个Apache模块,一个是mod_vhost_limit,用来限制请求并发数,一个是mod_limitipconn,用来控制 Apache的并发联接数,通过该模块可以限制同一来源IP的并发联接数.另一个模块是bw_mod,用于Apache网站带宽控制,可以根据来源IP, 网段来划分带宽,也可以根据网站文件类型来限制带宽,参数比较灵活,可以根据自己实际情况进行调整. 限制并发数 到官方网址: http://ivn.cl/category/apache/ (看不懂的,直接查找mod_vh

Mysql数据库 查看连接数,状态 最大并发数设置

show status like '%max_connections%'; ##mysql最大连接数set global max_connections=1000 ##重新设置show variables like '%max_connections%'; ##查询数据库当前设置的最大连接数 show global status like 'Max_used_connections'; ##服务器响应的最大连接数 show status like 'Threads%'; Variable_nam

性能测试:通过设置注册表提高 P2P/IIS 并发数

写在前面 在执行性能测试(如用 JMeter 直接压接口)的时候,有的时候并发数上不去.本机大面积出现 TCP 状态为 TIME_WAIT,除了放开 TCP 端口数和调整默认 TCP 释放时间外,另外几个注册表项同样重要且需要调整. 以下设置项针对的是本机和远端机. 设置完成后,重启下电脑使生效. 增加TCP 连接数:TcpNumConnections [HKLM\System\CurrentControlSet\Services\Tcpip\Parameters] TcpNumConnecti

并发数计算

与并发用户数相关的概念还包括“并发用户数”.“系统用户数”和“同时在线用户数”,下面用一个实际的例子来说明它们之间的差别.假设有一个OA系统,该系统有2000个使用用户——这就是说,可能使用该OA系统的用户总数是2000名,这个概念就是“系统用户数”,该系统有一个“在线统计”功能(系统用一个全局变量记数所有已登录的用户),从在线统计功能中可以得到,最高峰时有500人在线(这个500就是一般所说的“同时在线人数”),那么,系统的并发用户数是多少呢?根据我们对业务并发用户数的定义,这500就是整个系

最大并发数

最大并发数 // 1.创建一个队列(非主队列) NSOperationQueue *queue = [[NSOperationQueue alloc] init]; // 2.设置最大并发(最多同时并发执行3个任务) queue.maxConcurrentOperationCount = 3; // 3.添加操作到队列中(自动异步执行任务,并发) NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{

Linux查看连接数,并发数

Linux查看连接数,并发数 博客分类: 小记 linux 软连接 Bat代码   ln -s /home/ictfmcg/data/photo /var/jtnd/data/photo tomcat 6的Connector配置如下 Xml代码   <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"

Nginx限制ip链接数,Nginx如何限制并发数,同1个IP,nginx怎么限制流量/限制带宽?

nginx 限制ip并发数,也是说限制同一个ip同时连接服务器的数量.如何Nginx限制同一个ip的连接数,限制并发数目,限制流量/限制带宽? 通过下面nginx模块的使用,我们可以设置一旦并发链接数超过我们的设置,将返回503错误给对方.这样可以非常有效的防止CC攻击.在配合 iptables防火墙,基本上CC攻击就可以无视了.Nginx限制ip链接数,Nginx如何限制并发数,同1个IP,nginx怎么限制流量/限制带宽?请看下文: nginx 限制ip并发数,nginx限制IP链接数的范例