using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using log4net;
using System.Timers;
using System.Configuration;
namespace RfidDAWatcher
{
public partial class WatchService : ServiceBase
{
private ILog log = LogManager.GetLogger(typeof(WatchService));
private static Timer tmrWatchTimer = new Timer();
/// <summary>
/// 重启间隔小时数
/// </summary>
int ReStartHour = 0;
/// <summary>
/// 执行间隔
/// </summary>
string watchInterval = "";
/// <summary>
/// 是否需要重启服务
/// </summary>
DateTime LastReStartdt = DateTime.Now;
public WatchService()
{
InitializeComponent();
watchInterval = ConfigurationManager.AppSettings["WatchInterval"];
log.Error("服务器启动成功");
try
{
ReStartHour = Convert.ToInt16(ConfigurationManager.AppSettings["AddHours"]);
}
catch (Exception)
{
ReStartHour = 0;
}
tmrWatchTimer.Interval = int.Parse(watchInterval);
tmrWatchTimer.Elapsed += new ElapsedEventHandler(tmrWatchTimer_Elapsed);
tmrWatchTimer.Start();
tmrWatchTimer.Enabled = false;
log.Error("服务器启动成功2");
}
protected override void OnStart(string[] args)
{
//监视进程,监视数据库标志位
tmrWatchTimer.Enabled = true;
log.Error("服务器启动成功3");
}
protected override void OnStop()
{
tmrWatchTimer.Enabled = false;
}
/// <summary>
/// 启动方法
/// </summary>
public void ExcueStart()
{
// TODO: 在此处添加代码以启动服务。
//线程中启动Netty
log.ErrorFormat("服务开启,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//RunServer.zhuce();
OnStart(null);
log.ErrorFormat("服务开启成功,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
/// <summary>
/// 启动方法
/// </summary>
public void ExcueStop()
{
// TODO: 在此处添加代码以启动服务。
//线程中启动Netty
log.ErrorFormat("服务开启,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
//RunServer.zhuce();
OnStop();
log.ErrorFormat("服务开启成功,时间:{0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
/// <summary>
/// 定时器执行代码
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tmrWatchTimer_Elapsed(object sender, ElapsedEventArgs e)
{
tmrWatchTimer.Enabled = false;
try
{
/// <summary>
/// 是否需要重启服务
/// </summary>
bool isReStart = false;
///间隔时间大于0,并且已经到了需要重启的时间
if (ReStartHour > 0)
{
///判断是否需要重启
if (LastReStartdt < DateTime.Now.AddMinutes(-ReStartHour))
{
LastReStartdt = DateTime.Now;
isReStart = true;
log.Error(string.Format("Service ReStart datetime is {0} !!", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
}
}
ReStartWinServerMain(isReStart);
ReStartIISServerMain(isReStart);
}
catch (Exception ex)
{
log.ErrorFormat(ex.StackTrace);
}
tmrWatchTimer.Enabled = true;
}
#region 重启windows服务
/// <summary>
/// 重启windows服务
/// </summary>
/// <param name="isReStart">是否需要重启服务,无论服务当前是什么状态</param>
public void ReStartWinServerMain(bool isReStart)
{
try
{
string ServiceName = string.Empty;
for (int i = 0; i < 99; i++)
{
string Servicekey = string.Format("WinService{0}", i + 1);
try
{
ServiceName = ConfigurationManager.AppSettings[Servicekey];
ReStartWinServer(ServiceName, isReStart);
}
catch (Exception ex)
{
log.Error($"{ServiceName}:启动异常:{ex.Message}》{ex.StackTrace}");
continue;
}
if (string.IsNullOrEmpty(ServiceName)) continue;
}
}
catch (Exception ex)
{
log.Error($"{ServiceName}:启动异常:{ex.Message}》{ex.StackTrace}");
}
}
/// <summary>
/// 检测Windows服务,如果已停止则进行重启
/// </summary>
/// <param name="ServiceName">服务名称</param>
/// <param name="isReStart">是否需要重启,无论服务当前是什么状态</param>
public void ReStartWinServer(string ServiceName, bool isReStart)
{
try
{
if (string.IsNullOrEmpty(ServiceName)) return;
ServiceController sc = SearchService(ServiceName);
if (sc != null)
{
///判断是否需要重启
if (isReStart)
{
if (sc.Status == ServiceControllerStatus.Stopped)
{
sc.Start();
}
else if (sc.Status == ServiceControllerStatus.Running)
{
sc.Stop();
log.DebugFormat("WinService {0} STOP Succues !!", sc.ServiceName);
sc.Start();
}
log.DebugFormat("WinService {0} Restart Succues !!", sc.ServiceName);
}
log.DebugFormat("WinService {0} status is {1} !!", sc.ServiceName, sc.Status.ToString());
if (sc.Status == ServiceControllerStatus.Stopped)
{
sc.Start();
log.DebugFormat("WinService {0} Restart Succues !!", sc.ServiceName);
}
else if (sc.Status == ServiceControllerStatus.Running)
{
//服务处于运行中检测是否正常启动
//if (!"999".Equals(tmp))
//{
// sc.Stop();
// sc.Start();
//}
}
}
else
{
log.ErrorFormat("WinService {0} not exists!!", ServiceName);
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 遍历服务,得到对象
/// </summary>
/// <param name="servName"></param>
/// <returns></returns>
private ServiceController SearchService(string servName)
{
ServiceController[] svcs = ServiceController.GetServices();
foreach (ServiceController svc in svcs)
{
if (svc.ServiceName.Equals(servName))
return svc;
}
return null;
}
#endregion
#region 重启IIS应用池
/// <summary>
/// 重启IIS应用池
/// </summary>
/// <param name="isReStart">是否需要重启,无论服务当前是什么状态</param>
public void ReStartIISServerMain(bool isReStart)
{
string ServiceName = string.Empty;
try
{
for (int i = 0; i < 99; i++)
{
string Servicekey = string.Format("IISService{0}", i + 1);
try
{
ServiceName = ConfigurationManager.AppSettings[Servicekey];
ReStartIISServer(ServiceName, isReStart);
}
catch (Exception ex)
{
log.Error($"{ServiceName}:启动异常:{ex.Message}》{ex.StackTrace}");
continue;
}
if (string.IsNullOrEmpty(ServiceName)) continue;
}
}
catch (Exception ex)
{
log.Error($"{ServiceName}:启动异常:{ex.Message}》{ex.StackTrace}");
}
}
/// <summary>
/// 检测IIS应用池,如果已停止则进行重启
/// </summary>
/// <param name="ServiceName"></param>
/// <param name="isReStart">是否需要重启,无论服务当前是什么状态</param>
public void ReStartIISServer(string ServiceName, bool isReStart)
{
try
{
if (string.IsNullOrEmpty(ServiceName)) return;
Microsoft.Web.Administration.ApplicationPool sc = SearchIISService(ServiceName);
if (sc != null)
{
///判断是否需要重启
if (isReStart)
{
if (sc.State == Microsoft.Web.Administration.ObjectState.Stopped)
{
sc.Start();
}
else if (sc.State == Microsoft.Web.Administration.ObjectState.Started)
{
sc.Stop();
log.DebugFormat("IISService {0} STOP Succues !!", sc.Name);
sc.Start();
}
log.DebugFormat("IISService {0} Restart Succues !!", sc.Name);
}
log.DebugFormat("IISService {0} status is {1} !!", sc.Name, sc.State.ToString());
if (sc.State == Microsoft.Web.Administration.ObjectState.Stopped)
{
sc.Start();
log.DebugFormat("IISService {0} Restart Succues !!", sc.Name);
}
else if (sc.State == Microsoft.Web.Administration.ObjectState.Started)
{
//服务处于运行中检测是否正常启动
//if (!"999".Equals(tmp))
//{
// sc.Stop();
// sc.Start();
//}
}
}
else
{
log.ErrorFormat("IISService {0} not exists!!", ServiceName);
}
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 遍历IIS应用池服务,得到对象
/// </summary>
/// <param name="servName">IIS应用名称</param>
/// <returns></returns>
private Microsoft.Web.Administration.ApplicationPool SearchIISService(string servName)
{
try
{
var manager = new Microsoft.Web.Administration.ServerManager();
var Pools = manager.ApplicationPools;
var Pool = Pools.FirstOrDefault(a => a.Name == servName);
return Pool;
}
catch (Exception)
{
throw;
}
}
#endregion
}
}