using HDLMonitorService.Entity; using HDLMonitorService.Helper; using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace HDLMonitorService.ServiceMonitor { public class ServiceHandler { public readonly static ReaderWriterLockSlim RWLock = new ReaderWriterLockSlim(); public static Dictionary List = new Dictionary(); public static void CheckService() { new Thread(new ThreadStart(() => { while (true) { var keys = new List(); try { RWLock.EnterReadLock(); foreach (var key in List.Keys) { try { var values = List[key]; if (!values.IsOnline) { keys.Add(key); } } catch (Exception ex) { } } } catch (Exception ex) { LogHp.WriteLog("服务器监控异常", Newtonsoft.Json.JsonConvert.SerializeObject(ex)); } finally { RWLock.ExitReadLock(); } try { RWLock.EnterWriteLock(); foreach (var key in keys) { List.Remove(key); } } catch (Exception ex) { LogHp.WriteLog("服务器监控异常", Newtonsoft.Json.JsonConvert.SerializeObject(ex)); } finally { RWLock.ExitWriteLock(); } Thread.Sleep(1000 * 30); } })) { IsBackground= true }.Start(); } public static void ReigsterService(ServiceInfo info) { info.LastRegisterTime = DateTime.Now; info.LastHeartTime = DateTime.Now; try { RWLock.EnterWriteLock(); List[info.Address] = info; } catch (Exception ex) { LogHp.WriteLog("服务器监控异常", Newtonsoft.Json.JsonConvert.SerializeObject(ex)); } finally { RWLock.ExitWriteLock(); } } public static void HeartThread() { new Thread(new ThreadStart(() => { while (true) { try { foreach (var key in List.Keys) { var info = List[key]; Task.Run(() => { try { HttpHp.Post("http://" + info.Address, ""); info.LastHeartTime = DateTime.Now; info.AlarmCount = 0; info.ErrorCount = 0; LogHp.WriteLog("服务器监控异常", Newtonsoft.Json.JsonConvert.SerializeObject(info)); } catch (Exception ex) { info.ErrorCount += 1; if (info.ErrorCount == int.Parse(ConfigurationManager.AppSettings["LoopErrorCount"].ToString()) && info.AlarmCount < int.Parse(ConfigurationManager.AppSettings["LoopAlarmCount"].ToString())) { info.ErrorCount = 0; info.AlarmCount += 1; AlarmHp.ServiceAlarm(info.ServiceName, "服务已经" + ConfigurationManager.AppSettings["LoopErrorCount"].ToString() + "次没有响应,请尽快检查!", info.PublicAddress, "已检查到服务离线,请尽快检查!"); } } }); } } catch (Exception ex) { LogHp.WriteLog("服务器监控异常", Newtonsoft.Json.JsonConvert.SerializeObject(ex)); } Thread.Sleep(1000 * int.Parse(ConfigurationManager.AppSettings["LoopSeconds"].ToString())); } })) { IsBackground = true }.Start(); } } }