コード例 #1
0
        public async Task <bool> AllConsumersTearDownCalled()
        {
            var values = await Task.WhenAll(Consumers.Select(c => c.IsTearedDown()));

            var valuesGrouped = values.GroupBy(x => x);

            return(valuesGrouped.Count() == 1 && valuesGrouped.Count(group => group.Key == true) == 1);
        }
コード例 #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);
        }
コード例 #3
0
ファイル: XmlMqConfig.cs プロジェクト: chironn/Test2
        public List <IQueueConfig> ToList()
        {
            var result = new List <IQueueConfig>();

            if (Consumers != null)
            {
                result.AddRange(Consumers.Select(consumer => new MqConfig
                {
                    ServerIp        = ServerIp,
                    Port            = Port,
                    Password        = Password,
                    UserId          = UserId,
                    FindKey         = consumer.FindKey,
                    QueueName       = consumer.QueueName,
                    ExchangeName    = consumer.ExchangeName,
                    ExchangeType    = consumer.ExchangeType,
                    ExchangeDurable = consumer.ExchangeDurable,
                    BindKey         = consumer.BindKey,
                    RouteingKey     = consumer.BindKey,
                    RoleType        = "consumer"
                }));
            }

            if (Producers != null)
            {
                result.AddRange(Producers.Select(producer => new MqConfig
                {
                    ServerIp     = ServerIp,
                    Port         = Port,
                    Password     = Password,
                    UserId       = UserId,
                    FindKey      = producer.FindKey,
                    ExchangeName = producer.ExchangeName,
                    RouteingKey  = producer.RouteingKey,
                    // 绑定键与路由相同
                    BindKey  = producer.RouteingKey,
                    RoleType = "producer"
                }));
            }


            return(result);
        }
コード例 #4
0
ファイル: Dispatcher.cs プロジェクト: afacanerman/Paramore
        /// <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);
        }