Beispiel #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);
        }
Beispiel #2
0
        private void Start()
        {
            controlTask = Task.Factory.StartNew(
                () =>
            {
                if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED)
                {
                    State = DispatcherState.DS_RUNNING;
                    logger.Info("Dispatcher: Dispatcher starting");

                    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);
        }
Beispiel #3
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();
            }
        }