public void Consume(ExecuteSubTask <TInput> message) { TWorker worker = Builder.GetInstance <TWorker>(); try { int activeCount = Interlocked.Increment(ref _activeTaskCount); _log.DebugFormat("Starting SubTask {0} ({1})", message.SubTaskId, activeCount); worker.ExecuteTask(message.Task, output => Bus.Publish(new SubTaskComplete <TOutput>(Bus.Endpoint.Uri.ToString(), _taskLimit, _activeTaskCount - 1, message.TaskId, message.SubTaskId, output))); } finally { Builder.Release(worker); Interlocked.Decrement(ref _activeTaskCount); } }
private void DispatchSubTaskToWorkers() { if (_nextSubTask >= _distributedTask.SubTaskCount) { return; } IList <Worker> workers = GetAvailableWorkers(); while (workers.Count > 0) { foreach (Worker worker in workers) { if (_nextSubTask >= _distributedTask.SubTaskCount) { return; } IEndpoint endpoint = _endpointFactory.GetEndpoint(new Uri(worker.Address)); if (endpoint == null) { continue; } ExecuteSubTask <TInput> executeExecuteSubTask; lock (_workers) { if (_nextSubTask >= _distributedTask.SubTaskCount) { break; } TInput input = _distributedTask.GetSubTaskInput(_nextSubTask); executeExecuteSubTask = new ExecuteSubTask <TInput>(_bus.Endpoint.Uri.ToString(), _taskId, _nextSubTask++, input); worker.ActiveTaskCount++; } endpoint.Send(executeExecuteSubTask); } workers = GetAvailableWorkers(); } }