using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.ServiceProcess; using System.Text; using GZTW.AyaNova.BLL; namespace GeneratorService { public partial class AyGenSrv : ServiceBase { private System.Timers.Timer timer = null; private bool Initialized = false; private int maxTries = 0; private const int retryInterval = 60000; private const int processInterval = 300000; //case 2048 private string eventLogSource = "AyaNovaGenerator"; public AyGenSrv() { InitializeComponent(); //Init timer and set initial interval to 1 second //so that it starts "immediately" when the service starts //after it's fired it will go to it's normal cycle of 5 minutes timer = new System.Timers.Timer(1000); //set the event handler for the timer timer.Elapsed += new System.Timers.ElapsedEventHandler(this.ServiceTimer_Tick); } private bool TryConnecting() { //Failed to connect after maxtries? if (maxTries > 9) { EventLog.WriteEntry(eventLogSource, "Connection to AyaNova database could not be initialized after 10 attempts.\r\n" + "Other errors in the application error log before or after this one may provide more details.\r\n" + "The configuration file config.txt probably has an incorrect connection setting\r\n" + "to access the database (wrong path, login or password) or the database server is not running.", EventLogEntryType.Error); QuitNow(); return false; } if (GZTW.AyaNova.BLL.AyaBizUtils.AyaNovaConnectionSetting.SingleUserConnection) { EventLog.WriteEntry(eventLogSource, "The current database connection in the config.txt file specifies a stand alone embedded FireBird database.\r\n" + "Generator is not required for a single user database connection. It's required for a shared network connection only.\r\n" + "In a single user connection AyaNova handles the tasks of Generator automatically.\r\n" + "Generator will now close.\r\n" + "See the AyaNova manual for more details.", EventLogEntryType.Error); QuitNow(); return false; } //not timed out so try to connect try { GZTW.AyaNova.BLL.AyaBizUtils.Initialize(); //case 2093 ampersand in name crashing generator service // eventLogSource = "AyaNovaGenerator - (" + AyaBizUtils.REGTO + ")"; eventLogSource = "AyaNovaGenerator - (" + System.Text.RegularExpressions.Regex.Replace(AyaBizUtils.REGTO, @"[^A-Za-z0-9]+", "") +")"; Initialized = true; EventLog.WriteEntry(eventLogSource, "Connection established", EventLogEntryType.Information); } catch (Exception ex) { Initialized = false; maxTries++; if(maxTries < 10) EventLog.WriteEntry(eventLogSource, "Connection failed (attempt "+maxTries.ToString()+" of 10 ) - retrying in 1 minute", EventLogEntryType.Warning); //Only log the last attempt, earlier ones could have been waiting for dbserver to start and not relevant string strMessage = ex.Message; if (ex.InnerException != null) strMessage = ex.InnerException.Message; if(maxTries > 9) EventLog.WriteEntry(eventLogSource, strMessage, EventLogEntryType.Error); } return Initialized; } private void QuitNow() { timer.Stop(); timer.AutoReset = false; timer.Enabled = false; this.Stop(); } protected override void OnStart(string[] args) { timer.AutoReset = true; timer.Enabled = true; timer.Start(); } protected override void OnStop() { timer.Stop(); timer.AutoReset = false; timer.Enabled = false; base.OnStop(); } protected override void OnPause() { timer.Stop(); base.OnPause(); } protected override void OnContinue() { timer.Start(); base.OnContinue(); } //process private void ServiceTimer_Tick(object sender, System.Timers.ElapsedEventArgs e) { this.timer.Stop(); //make an appearance of less memory for those that don't understand how .net memory allocation works //and bitch to us that task manager shows it's using too much memory try { System.Diagnostics.Process loProcess = System.Diagnostics.Process.GetCurrentProcess(); loProcess.MaxWorkingSet = loProcess.MaxWorkingSet;//doesn't matter what you set it to, just setting it triggers re-evalutaion } catch { }; //If not initialized restart with a shorter timer than normal if (!Initialized) { if (!TryConnecting()) { this.timer.Interval = retryInterval; this.timer.Start(); return; } } //It's initialized so process as normal try { GenProcess.GO("121605GENERATOR", "121605GENERATOR"); } catch (Exception ex) { string strMessage = ex.Message; if (ex.InnerException != null) strMessage = ex.InnerException.Message; EventLog.WriteEntry(eventLogSource, strMessage, EventLogEntryType.Error); } this.timer.Interval = processInterval; this.timer.Start(); } } }