Exemple #1
0
        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();
            }
        }