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)); }
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 { } }