示例#1
0
        private void Dequeue(K key, ParallelQueueUnit q, int count)
        {
            V[] vals = new V[count];
            for (int i = 0; i < count; i++)
            {
                V item = q.Queue.Dequeue();
                vals[i] = item;
            }

            _perfCounters.DequeueTotal.Increment();
            _perfCounters.DequeuePerSecond.Increment();
            _perfCounters.DequeueConcurrent.Increment();

            ThreadPool.QueueUserWorkItem(new WaitCallback(
                                             delegate {
                try {
                    _dequeueAction(key, vals);
                } catch (Exception ex) {
                    _tracing.Error(ex, "ParallelQueue DequeueAction Failed");
                    _perfCounters.DequeueFailed.Increment();
                } finally {
                    _perfCounters.DequeueConcurrent.Decrement();
                }
            }
                                             )
                                         );
        }
示例#2
0
 public void FlushCache()
 {
     lock (_syncRoot) {
         foreach (KeyValuePair <K, ParallelQueueUnit> p in _queues)
         {
             ParallelQueueUnit queue = p.Value;
             while (queue.Queue.Count > 0)
             {
                 int queueCount   = queue.Queue.Count;
                 int dequeueCount = queueCount > _maxBatchCount ? _maxBatchCount : queueCount;
                 Dequeue(p.Key, queue, dequeueCount);
             }
         }
     }
 }
示例#3
0
 /// <summary>
 /// flush 特定key 的 queue
 /// </summary>
 /// <param name="key"></param>
 public void FlushCacheByKey(K key)
 {
     lock (_syncRoot)
     {
         ParallelQueueUnit queueUnit = null;
         if (_queues.TryGetValue(key, out queueUnit))
         {
             while (queueUnit.Queue.Count > 0)
             {
                 int queueCount   = queueUnit.Queue.Count;
                 int dequeueCount = queueCount > _maxBatchCount ? _maxBatchCount : queueCount;
                 Dequeue(key, queueUnit, dequeueCount);
             }
         }
     }
 }
示例#4
0
        private void ThreadProc()
        {
            while (true)
            {
                try {
                    int  nowTick = Environment.TickCount;
                    bool idle    = true;
                    int  workerThreads;
                    int  iocpThreads;
                    ThreadPool.GetAvailableThreads(out workerThreads, out iocpThreads);

                    //
                    // 线程池忙时会进入保护状态
                    if (workerThreads < _defendWorkerThreadCounts)
                    {
                        idle = true;
                    }
                    else
                    {
                        lock (_syncRoot) {
                            foreach (KeyValuePair <K, ParallelQueueUnit> p in _queues)
                            {
                                ParallelQueueUnit queue = p.Value;
                                int count = GetDequeueCount(nowTick, queue);
                                if (count > 0)
                                {
                                    Dequeue(p.Key, queue, count);
                                    _perfCounters.QueueLength.IncrementBy(-count);
                                    idle = false;
                                }
                            }
                        }
                    }
                    if (idle)
                    {
                        Thread.Sleep(1);
                    }
                } catch (ThreadAbortException) {
                    Thread.ResetAbort();
                    FlushCache();
                    return;
                } catch (Exception ex) {
                    SystemLog.Error(LogEventID.ServiceFailed, ex, "Parallel<{0}> Raise Exception", _queueName);
                    Thread.Sleep(1000);
                }
            }
        }
示例#5
0
        private int GetDequeueCount(int nowTick, ParallelQueueUnit q)
        {
            int queueCount = q.Queue.Count;

            if (queueCount >= _maxBatchCount)
            {
                return(_maxBatchCount);
            }
            else
            {
                int passedTick = nowTick - q.LastTick;
                if (((passedTick > _maxIdleMs) || (passedTick < -_maxIdleMs)) && queueCount > 0)
                {
                    q.LastTick = nowTick;
                    return(queueCount);
                }
                else
                {
                    return(0);
                }
            }
        }
示例#6
0
        public void Enqueue(K queueKey, V value)
        {
            lock (_syncRoot) {
                ParallelQueueUnit queue;
                if (!_queues.TryGetValue(queueKey, out queue))
                {
                    queue          = new ParallelQueueUnit();
                    queue.LastTick = Environment.TickCount;
                    _queues.Add(queueKey, queue);
                }
                if (queue.Queue.Count >= MaxQueueCount)
                {
                    //
                    // Discard Queue保护自己
                    _perfCounters.DiscardTotal.Increment();
                }
                queue.Queue.Enqueue(value);
            }

            _perfCounters.EnqueuePerSecond.Increment();
            _perfCounters.EnqueueTotal.Increment();
            _perfCounters.QueueLength.Increment();
        }