Esempio n. 1
0
        private void Start()
        {
            _controlTask = Task.Factory.StartNew(() =>
            {
                if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED)
                {
                    _logger.Info("Dispatcher: Dispatcher starting");
                    State = DispatcherState.DS_RUNNING;

                    var consumers = Consumers.ToArray();
                    consumers.Each((consumer) => consumer.Open());
                    consumers.Each(consumer => _tasks.TryAdd(consumer.JobId, consumer.Job));

                    _logger.InfoFormat("Dispatcher: Dispatcher starting {0} performers", _tasks.Count);

                    while (!_tasks.IsEmpty)
                    {
                        try
                        {
                            var runningTasks     = _tasks.Values.ToArray();
                            var index            = Task.WaitAny(runningTasks);
                            var stoppingConsumer = runningTasks[index];
                            _logger.DebugFormat("Dispatcher: Performer stopped with state {0}", stoppingConsumer.Status);

                            var consumer = Consumers.SingleOrDefault(c => c.JobId == stoppingConsumer.Id);
                            if (consumer != null)
                            {
                                _logger.DebugFormat("Dispatcher: Removing a consumer with connection name {0}", consumer.Name);
                                consumer.Dispose();

                                _consumers.TryRemove(consumer.Name, out consumer);
                            }

                            //_tasks[index].Dispose();
                            //_tasks.RemoveAt(index);
                            //_tasks.TryTake(out )
                            Task removedTask;
                            _tasks.TryRemove(stoppingConsumer.Id, out removedTask);
                        }
                        catch (AggregateException ae)
                        {
                            ae.Handle(
                                (ex) =>
                            {
                                _logger.ErrorFormat("Dispatcher: Error on consumer; consumer shut down");
                                return(true);
                            });
                        }
                    }

                    State = DispatcherState.DS_STOPPED;
                    _logger.Info("Dispatcher: Dispatcher stopped");
                }
            },
                                                 TaskCreationOptions.LongRunning);
        }
Esempio n. 2
0
        private void Start()
        {
            _controlTask = Task.Factory.StartNew(() =>
                {
                    if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED)
                    {
                        _logger.Info("Dispatcher: Dispatcher starting");
                        State = DispatcherState.DS_RUNNING;

                        var consumers = Consumers.ToArray();
                        consumers.Each((consumer) => consumer.Open());
                        consumers.Select(consumer => consumer.Job).Each(job => _tasks.Add(job));

                        _logger.InfoFormat("Dispatcher: Dispatcher starting {0} performers", _tasks.Count);

                        while (_tasks.Any())
                        {
                            try
                            {
                                var index = Task.WaitAny(_tasks.ToArray());
                                _logger.DebugFormat("Dispatcher: Performer stopped with state {0}", _tasks[index].Status);

                                var consumer = Consumers.SingleOrDefault(c => c.JobId == _tasks[index].Id);
                                if (consumer != null)
                                {
                                    _logger.DebugFormat("Dispatcher: Removing a consumer with connection name {0}", consumer.Name);
                                    consumer.Dispose();
                                    Consumers.Remove(consumer);
                                }

                                _tasks[index].Dispose();
                                _tasks.RemoveAt(index);
                            }
                            catch (AggregateException ae)
                            {
                                ae.Handle(
                                    (ex) =>
                                    {
                                        _logger.ErrorFormat("Dispatcher: Error on consumer; consumer shut down");
                                        return true;
                                    });
                            }
                        }

                        State = DispatcherState.DS_STOPPED;
                        _logger.Info("Dispatcher: Dispatcher stopped");
                    }
                },
                TaskCreationOptions.LongRunning);
        }
Esempio n. 3
0
        public override async Task <bool> ConsumeDroplet(T droplet)
        {
            if (Consumers.Count == 0)
            {
                return(false);
            }
            if (Current >= Consumers.Count)
            {
                Current = 0;
            }
            bool ret = await Consumers.ToArray()[Current].ConsumeDroplet(droplet);

            return(ret || ++Current != Consumers.Count);
        }
        public override async Task <bool> ConsumeDroplet(T droplet)
        {
            if (Consumers.Count == 0)
            {
                return(false);
            }
            if (Current >= Consumers.Count)
            {
                Current  = 0;
                AllFalse = true;
            }
            bool ret = await Consumers.ToArray()[Current++].ConsumeDroplet(droplet);

            if (ret)
            {
                AllFalse = false;
            }
            else if (AllFalse && Current == Consumers.Count)
            {
                return(false);
            }
            return(true);
        }
Esempio n. 5
0
        private void Start()
        {
            _controlTask = Task.Factory.StartNew(() =>
            {
                if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED)
                {
                    s_logger.LogInformation("Dispatcher: Dispatcher starting");
                    State = DispatcherState.DS_RUNNING;

                    var consumers = Consumers.ToArray();
                    consumers.Each(consumer => consumer.Open());
                    consumers.Each(consumer => _tasks.TryAdd(consumer.JobId, consumer.Job));

                    s_logger.LogInformation("Dispatcher: Dispatcher starting {Consumers} performers", _tasks.Count);

                    while (_tasks.Any())
                    {
                        try
                        {
                            var runningTasks     = _tasks.Values.ToArray();
                            var index            = Task.WaitAny(runningTasks);
                            var stoppingConsumer = runningTasks[index];
                            s_logger.LogDebug("Dispatcher: Performer stopped with state {Status}", stoppingConsumer.Status);

                            var consumer = Consumers.SingleOrDefault(c => c.JobId == stoppingConsumer.Id);
                            if (consumer != null)
                            {
                                s_logger.LogDebug("Dispatcher: Removing a consumer with subscription name {ChannelName}", consumer.Name);

                                if (_consumers.TryRemove(consumer.Name, out consumer))
                                {
                                    consumer.Dispose();
                                }
                            }

                            if (_tasks.TryRemove(stoppingConsumer.Id, out Task removedTask))
                            {
                                removedTask.Dispose();
                            }

                            stoppingConsumer.Dispose();
                        }
                        catch (AggregateException ae)
                        {
                            ae.Handle(ex =>
                            {
                                s_logger.LogError(ex, "Dispatcher: Error on consumer; consumer shut down");
                                return(true);
                            });
                        }
                    }

                    State = DispatcherState.DS_STOPPED;
                    s_logger.LogInformation("Dispatcher: Dispatcher stopped");
                }
            },
                                                 TaskCreationOptions.LongRunning);

            while (State != DispatcherState.DS_RUNNING)
            {
                Task.Delay(100).Wait();
            }
        }