using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Neo.Afx.Services { public class FileSystemServiceScheduler { List _serviceTasks; ServiceTaskScheduler _serviceTaskScheduler; readonly ServiceConfigurations _serviceConfigurations; #region FileSystemServiceScheduler public FileSystemServiceScheduler() { _serviceConfigurations = new ServiceConfigurations(); } #endregion #region Start /// /// Starts the scheduler. /// public void Start() { var services = _serviceConfigurations.GetServices(); if(services.Count() == 0) { UpdateRunStatus("Start", DateTime.Now, "No services configured in application configuration file."); } try { _serviceTasks = new List( services.Select( service => new ServiceTask(new ServiceSchedule((PollFrequencyEnum)service.PollFrequencyID, TimeSpan.Parse(service.PollTime)), service.ServiceID, service.ServiceName, (IExecutable)Worker.Create(service.ServiceTypeName, _serviceConfigurations.GetSystemUserID(), _serviceConfigurations.GetSystemUserEmail(), service.Settings)))); _serviceTaskScheduler = new ServiceTaskScheduler(_serviceTasks); _serviceTaskScheduler.TaskBusy += OnServiceTaskBusy; _serviceTaskScheduler.TaskCompleted += OnServiceTaskCompleted; _serviceTaskScheduler.UnhandledError += OnUnhandledError; _serviceTaskScheduler.Start(); } catch(Exception ex) { UpdateRunStatus("Start", DateTime.Now, (ex.Message.ToLower().IndexOf("inner excep") != -1 ? ex.InnerException.Message : ex.Message)); } } #endregion #region Stop /// /// Stops the scheduler. /// public void Stop() { if(_serviceTaskScheduler != null) { _serviceTaskScheduler.TaskBusy -= OnServiceTaskBusy; _serviceTaskScheduler.TaskCompleted -= OnServiceTaskCompleted; _serviceTaskScheduler.UnhandledError -= OnUnhandledError; _serviceTaskScheduler = null; } if(_serviceTasks == null) { return; } _serviceTasks.Clear(); _serviceTasks = null; } #endregion #region OnServiceTaskBusy/Completed void OnServiceTaskBusy(object sender, ServiceTaskEventArgs e) { UpdateRunStatus(e.ServiceTask.ServiceName, e.SignalTime, "Service is busy"); } void OnServiceTaskCompleted(object sender, ServiceTaskEventArgs e) { if(e.ServiceTask.Exceptions != null) { foreach(var ex in e.ServiceTask.Exceptions) { UpdateRunStatus(e.ServiceTask.ServiceName, e.ServiceTask.Schedule.LastRunTime, (ex.Message.ToLower().IndexOf("inner excep") != -1 ? ex.InnerException.Message : ex.Message)); } } UpdateRunStatus(e.ServiceTask.ServiceName, e.ServiceTask.Schedule.LastRunTime, e.ServiceTask.TraceInfo); } #endregion #region OnUnhandledError void OnUnhandledError(object sender, ErrorEventArgs e) { var ex = e.GetException(); UpdateRunStatus("Unhandled", DateTime.Now, (ex.Message.ToLower().IndexOf("inner excep") != -1 ? ex.InnerException.Message : ex.Message)); } #endregion #region Update Audit/Trace Log public void UpdateRunStatus(string sourceName, DateTime runDate, string traceInfo) { _serviceConfigurations.UpdateRunStatus(sourceName, runDate, traceInfo); } #endregion } }