保证依赖的服务已全部启动

1.功能介绍:

  保证配置文件中,设置的服务已全部启动;未启动的服务,以异常日志的形式记录。

2.设计思路:

  Step1:配置文件设置需要默认启动的服务名称

  Step2:声明一个服务类对象sc,并从配置文件中的文件名读取出来放于数组depenentServiceArray当中

  Step3:遍历服务名称集合。若服务未启动,则启动该服务,并记录日志;若服务异常,则记录服务异常日志

  Step4:判断服务是否全部启动。若没有全部启动,则线程休眠规定时间,再次循环,直到服务成功启动;若完成启动,则退出

3.ServiceController 介绍:

  定义:可以使用 ServiceController 类连接到现有服务并控制其行为,当创建 ServiceController 类的实例时,设置其属性,以便它与特定的 Windows 服务交互作用。然后可以使用此类来启动、停止和以其他方式操作该服务。

  创建 ServiceController 的实例后,必须为其设置两个属性来标识与其交互的服务:计算机名称和要控制的服务的名称。

4.代码片段:

public class ServiceProcessorUtil
    {
        public static void CheckDependentServiceAndWait()
        {
            string dependentServices = ConfigurationManager.AppSettings["DependentServices"];    //从配置文件读取依赖服务集
            if (!string.IsNullOrEmpty(dependentServices))
            {
                bool success;
                System.ServiceProcess.ServiceController sc;
                string[] depenentServiceArray = dependentServices.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
                while (true)
                {
                    success = true;
                    foreach (string serviceName in depenentServiceArray)    //遍历依赖的服务集
                    {
                        sc = new System.ServiceProcess.ServiceController(serviceName);    //初始化计算机上与服务有关的类
                        if (sc != null)
                        {
                            try
                            {
                                if (sc.Status != System.ServiceProcess.ServiceControllerStatus.Running)
                                {
                                    sc.Start();
                                    //ExceptionUtil:异常处理公共方法
                                    ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "不存在或未正常运行"));
                                    success = false;
                                    break;
                                }
                            }
                            catch
                            {
                                ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "未正常运行"));
                                success = false;
                                break;
                            }
                        }
                        else
                        {
                            ExceptionUtil.WriteLog(new Exception("依赖的服务:" + serviceName + "不存在"));
                            success = false;
                            break;
                        }
                        sc.Close();
                        sc.Dispose();
                    }
                    if (success)
                    {
                        break;
                    }
                    else
                    {
                        Thread.Sleep(Convert.ToInt16(ConfigurationManage.AppSettings["ThreadSleepTime"]) * 1000);
                    }
                }
            }
        }
    }

 

posted @ 2017-05-09 19:58  一夜泪水催人醉  阅读(226)  评论(0编辑  收藏  举报