示例#1
0
        /// <summary>
        /// Stop listening to messages
        /// </summary>
        /// <returns>Task.</returns>
        public Task End()
        {
            if (State == DispatcherState.DS_RUNNING)
            {
                s_logger.LogInformation("Dispatcher: Stopping dispatcher");
                Consumers.Each(consumer => consumer.Shut());
            }

            return(_controlTask);
        }
示例#2
0
        /// <summary>
        /// Stop listening to messages
        /// </summary>
        /// <returns>Task.</returns>
        public Task End()
        {
            if (State == DispatcherState.DS_RUNNING)
            {
                logger.Info("Dispatcher: Stopping dispatcher");
                Consumers.Each((consumer) => consumer.Shut());
            }

            return(controlTask);
        }
示例#3
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);
        }
示例#4
0
        /// <summary>
        /// Begins listening for messages on channels, and dispatching them to request handlers.
        /// </summary>
        public void Receive()
        {
            controlTask = Task.Factory.StartNew(() =>
            {
                if (State == DispatcherState.DS_AWAITING || State == DispatcherState.DS_STOPPED)
                {
                    State = DispatcherState.DS_RUNNING;
                    logger.Debug(m => m("Dispatcher: Dispatcher starting"));

                    Consumers.Each((consumer) => consumer.Open());

                    Consumers.Select(consumer => consumer.Job).Each(job => tasks.Add(job));

                    logger.Debug(m => m("Dispatcher: Dispatcher starting {0} performers", tasks.Count));

                    while (tasks.Any())
                    {
                        try
                        {
                            var index = Task.WaitAny(tasks.ToArray());
                            //TODO: This doesn't really identify the connection that we closed - which is what we want diagnostically
                            logger.Debug(m => m("Dispatcher: Performer stopped with state {0}", tasks[index].Status));
                            tasks.RemoveAt(index);
                        }
                        catch (AggregateException ae)
                        {
                            ae.Handle((ex) =>
                            {
                                logger.Error(m => m("Dispatcher: Error on consumer; consumer shut down"));
                                return(true);
                            });
                        }
                    }

                    State = DispatcherState.DS_STOPPED;
                    logger.Debug(m => m("Dispatcher: Dispatcher stopped"));
                }
            },
                                                TaskCreationOptions.LongRunning);
        }