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

Posted yyjackma

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了保证依赖的服务已全部启动相关的知识,希望对你有一定的参考价值。

1.功能介绍:

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

2.设计思路:

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

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

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

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

3.代码片段:

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);
                    }
                }
            }
        }
    }

 

以上是关于保证依赖的服务已全部启动的主要内容,如果未能解决你的问题,请参考以下文章

Docker-compose编排微服务顺序启动

Docker容器依赖link连接按顺序启动

Docker容器依赖link连接按顺序启动

Docker容器依赖link连接按顺序启动

Docker容器依赖link连接按顺序启动

微服务架构 - 解决Docker-Compose服务编排启动顺序问题