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<string, ServiceInfo> List = new Dictionary<string, ServiceInfo>();
|
|
public static void CheckService()
|
{
|
new Thread(new ThreadStart(() =>
|
{
|
while (true)
|
{
|
var keys = new List<string>();
|
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<object>("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();
|
}
|
}
|
}
|