Example #1
0
        private bool Enqueue(IMessageHandleTask task, int limit)
        {
            while (_currentTasks < limit)
            {
                var temp = _currentTasks;
                if (Interlocked.CompareExchange(ref _currentTasks, temp + 1, temp) != temp)
                {
                    continue;
                }

                ThreadPool.QueueUserWorkItem(state =>
                {
                    task.Execute(_listener);

                    while (_queue.TryTake(out var item))
                    {
                        item.Execute(_listener);
                    }

                    Interlocked.Decrement(ref _currentTasks);
                });

                return(true);
            }

            return(false);
        }
        private object DispatchTask(IMessageHandleTask task)
        {
            var message = task.Message();
            var subject = message.Subject;
            var group   = message.GetStringProperty(BaseMessage.keys.qmq_consumerGroupName);
            var key     = KeyOf(subject, group);

            _handlers.TryGetValue(key, out var handler);
            if (handler == null)
            {
                return(new ConsumerRejectException("消费者尚未初始化完成"));
            }
            return(task.DispatchTo(handler));
        }
Example #3
0
        public bool Handle(IMessageHandleTask task)
        {
            if (Enqueue(task, MinThreads))
            {
                return(true);
            }

            if (_queue.TryAdd(task))
            {
                return(true);
            }

            return(Enqueue(task, MaxThreads));
        }
        private object TaskReceived(IMessageHandleTask task)
        {
            var message = task.Message();

            try
            {
                return(DispatchTask(task));
            }
            catch (Exception ex)
            {
                throw;
            }
            finally
            {
            }
        }