private MessageService() { //try //{ //load configuration ParseConfig(); //check failed messages on start FileInfo fi = new FileInfo(_filepath); if (fi.Exists) _hasFailures = true; _activeHost = FindHost(); //set timer for periodic connectivity check TimerCallback tcb = new TimerCallback(TimerElapsed); Timer timer = new Timer(tcb, null, _checktime, _checktime); //} //catch //{ //intentionally left blank to not have the Windows Unhandled Exception box //} }
private void ParseConfig() { //load configuration file XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load("configuration.xml"); //parse elements XmlElement root = xmlDoc.DocumentElement; foreach (XmlElement element in root.ChildNodes) { if (element.Name == "hosts") { foreach (XmlElement subElement in element.ChildNodes) { if (subElement.Name == "host") { if (subElement.ChildNodes.Count == 2) { XmlNode IP = subElement.ChildNodes[0]; XmlNode port = subElement.ChildNodes[1]; Host myHost = new Host(IP.InnerText, int.Parse(port.InnerText)); _hosts.Add(myHost); } } } } if (element.Name == "backupFile") { _filepath = element.InnerText; } if (element.Name == "logPath") { _logpath = ((element.InnerText.EndsWith(@"\") ? element.InnerText.Substring(0, element.InnerText.Length - 1) : element.InnerText) + @"\" + DateTime.Today.ToString("yyyyMMdd") + ".log"); } if (element.Name == "interval") { _checktime = long.Parse(element.InnerText); } } //log application startup string message = string.Format("{0}{1} - Application started{0}", Environment.NewLine, DateTime.Now.ToString("HH:mm:ss.ffffff")); File.AppendAllText(_logpath, message, Encoding.UTF8); }
//timer callback private void TimerElapsed(object info) { _activeHost = FindHost(); }
void OnDoWork(object sender, DoWorkEventArgs e) { while (_messages.Count > 0) { TcpClient client = new TcpClient(); try { client.Connect(IPAddress.Parse(_activeHost.IP), _activeHost.Port); string message = _messages.Dequeue(); byte[] buffer = Encoding.Unicode.GetBytes(message); client.Client.Send(buffer); Log(new MessageEventArgs(message, _messages.Count, MessageStatus.Success, null)); } catch (SocketException ex) { _hasFailures = true; string[] messages = _messages.ToArray(); Log(new MessageEventArgs(null, _messages.Count, MessageStatus.Failure, ex.Message)); _messages.Clear(); //save array to file StringBuilder allMessages = new StringBuilder(); foreach (string message in messages) { allMessages.Append(message + Environment.NewLine); } File.AppendAllText(_filepath, allMessages.ToString(), Encoding.UTF8); //failover _activeHost = FindHost(); } finally { if (client.Connected) { client.Client.Shutdown(SocketShutdown.Both); client.Client.Disconnect(false); } } } _backgroundWorker = null; }