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); }
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); }
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); }
/// <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); }