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