示例#1
0
        /// <summary>
        /// 加载单元
        /// </summary>
        /// <param name="unitKey"></param>
        /// <returns></returns>
        public UnitSettings LoadUnit(String unitKey)
        {
            if (!this.Useable)
            {
                return(null);
            }
            /*特殊处理*/ if (unitKey == "self" || unitKey == "wind" || unitKey == "daemon")
            {
                return(null);
            }                                                                                /*特殊处理*/
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadUnit", "开始加载单元配置文件");
            //读取文件
            String unitFilePath = String.Concat(this.UnitsDirectory, Path.DirectorySeparatorChar, unitKey, ".json");

            if (!File.Exists(unitFilePath))
            {
                LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadUnit[Error]", $"单元配置文件 {unitFilePath} 不存在");
                return(null);
            }
            FileInfo fileInfo;

            try {
                fileInfo = new FileInfo(unitFilePath);
            }catch (Exception exception) {
                LoggerModuleHelper.TryLog(
                    "Modules.UnitManageModule.LoadUnit[Error]",
                    $"单元配置文件 {unitFilePath} 文件信息异常,: {exception.Message}\n异常堆栈: {exception.StackTrace}");
                return(null);
            }
            //setting
            UnitSettings unitSettings = UnitManageModuleHelper.ParseUnitSettingsFile(fileInfo);

            if (unitSettings == null)
            {
                LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadUnit[Warning]", $"单元文件\"{unitFilePath}\"读取失败");
                return(null);
            }
            //检查是新增或更新
            if (this.UnitDictionary.ContainsKey(unitKey))
            {
                this.UnitDictionary[unitKey].Settings = unitSettings;
            }
            else
            {
                _ = this.UnitDictionary.TryAdd(unitKey, new Unit {
                    Key = unitKey, Settings = unitSettings
                });
            }
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadUnit", $"单元\"{unitKey}\"读取成功,已加入单元列表");
            return(unitSettings);
        }
示例#2
0
        /// <summary>
        /// 解析所有单元配置文件
        /// </summary>
        /// <returns>解析成功单元列表</returns>
        public List <UnitSettings> LoadAllUnits()
        {
            if (!this.Useable)
            {
                return(null);
            }
            //读取文件目录
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadAllUnits", "开始解析所有单元配置文件");
            FileInfo[] fileInfoArray;
            try {
                DirectoryInfo directoryInfo = new DirectoryInfo(this.UnitsDirectory);
                fileInfoArray = directoryInfo.GetFiles("*.json", SearchOption.TopDirectoryOnly);
            }catch (Exception exception) {
                LoggerModuleHelper.TryLog(
                    "Modules.UnitManageModule.LoadAllUnits[Error]",
                    $"读取单元存放目录异常,{exception.Message}\n异常堆栈: {exception.StackTrace}");
                return(null);
            }
            if (fileInfoArray.Length < 1)
            {
                return(null);
            }
            //解析文件
            List <UnitSettings> unitSettingsList = new List <UnitSettings>();

            for (Int32 i1 = 0; i1 < fileInfoArray.Length; i1++)
            {
                //key
                String unitKey = UnitManageModuleHelper.GetUnitKey(fileInfoArray[i1]);
                /*特殊处理*/ if (unitKey == "self" || unitKey == "wind" || unitKey == "daemon")
                {
                    continue;
                }                                                                             /*特殊处理*/
                if (String.IsNullOrWhiteSpace(unitKey) || unitKey.Length > 32)
                {
                    LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadAllUnits[Warning]", $"单元文件\"{fileInfoArray[i1].FullName}\"标识错误,已跳过");
                    continue;
                }
                //setting
                UnitSettings unitSettings = UnitManageModuleHelper.ParseUnitSettingsFile(fileInfoArray[i1]);
                if (unitSettings == null)
                {
                    LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadAllUnits[Warning]", $"单元文件\"{fileInfoArray[i1].FullName}\"读取失败,已跳过");
                    continue;
                }
                //检查是新增或更新
                if (this.UnitDictionary.ContainsKey(unitKey))
                {
                    this.UnitDictionary[unitKey].Settings = unitSettings;
                }
                else
                {
                    _ = this.UnitDictionary.TryAdd(unitKey, new Unit {
                        Key = unitKey, Settings = unitSettings
                    });
                }
                unitSettingsList.Add(unitSettings);
                LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadAllUnits", $"单元\"{unitKey}\"读取成功,已加入单元列表");
            }
            //完成
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.LoadAllUnits", $"已解析 {this.UnitDictionary.Count} 个单元配置文件");
            return(this.UnitDictionary.Count > 0?unitSettingsList:null);
        }
示例#3
0
        /// <summary>
        /// 启动单元
        /// </summary>
        /// <param name="unitKey"></param>
        /// <param name="forAutoStart"></param>
        public Int32 StartUnit(String unitKey, Boolean forAutoStart)
        {
            if (!this.Useable)
            {
                return(0);
            }
            if (this.UnitDictionary.Count < 1 || !this.UnitDictionary.ContainsKey(unitKey))
            {
                return(0);
            }
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.StartUnit", $"正在启动\"{unitKey}\"单元");
            Unit unit = this.UnitDictionary[unitKey];

            if (unit.State == 1 || unit.State == 2)
            {
                return(unit.ProcessId);
            }
            if (unit.State == 3)
            {
                SpinWait.SpinUntil(() => false, 1000);
            }
            unit.State           = 1;
            unit.RunningSettings = unit.Settings.DeepClone();
            ProcessStartInfo processStartInfo = new ProcessStartInfo {
                FileName               = unit.RunningSettings.AbsoluteExecutePath, WorkingDirectory = unit.RunningSettings.AbsoluteWorkDirectory, Arguments = unit.RunningSettings.Arguments,
                CreateNoWindow         = true, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false,
                RedirectStandardOutput = true, RedirectStandardError = true, RedirectStandardInput = true,
                StandardOutputEncoding = UnitManageModuleHelper.GetEncoding(unit.RunningSettings.StandardOutputEncoding),
                StandardErrorEncoding  = UnitManageModuleHelper.GetEncoding(unit.RunningSettings.StandardErrorEncoding),
                StandardInputEncoding  = UnitManageModuleHelper.GetEncoding(unit.RunningSettings.StandardInputEncoding)
            };

            if (unit.RunningSettings.EnvironmentVariables != null)
            {
                foreach (KeyValuePair <String, String> item in unit.RunningSettings.EnvironmentVariables)
                {
                    processStartInfo.EnvironmentVariables[item.Key] = item.Value;
                }
            }
            unit.Process = new Process {
                StartInfo = processStartInfo, EnableRaisingEvents = true
            };
            unit.Process.Exited             += this.OnUnitProcessExited;
            unit.Process.OutputDataReceived += this.OnProcessOutputDataReceived;
            unit.Process.ErrorDataReceived  += this.OnProcessErrorDataReceived;
            if (forAutoStart && unit.RunningSettings.AutoStartDelay > 0)
            {
                SpinWait.SpinUntil(() => false, unit.RunningSettings.AutoStartDelay * 1000);
            }
            try {
                if (!unit.Process.Start())
                {
                    LoggerModuleHelper.TryLog("Modules.UnitManageModule.StartUnit", $"启动\"{unitKey}\"单元失败");
                    unit.State = 0;
                    if (Program.RemoteControlModule.Useable)
                    {
                        Program.RemoteControlModule.StopNotify(unitKey);
                    }
                    return(0);
                }
            }catch (Exception exception) {
                LoggerModuleHelper.TryLog(
                    "Modules.UnitManageModule.StartUnit[Error]",
                    $"启动\"{unitKey}\"单元异常,{exception.Message}\n异常堆栈: {exception.StackTrace}");
                unit.State = 0;
                if (Program.RemoteControlModule.Useable)
                {
                    Program.RemoteControlModule.StopNotify(unitKey);
                }
                return(0);
            }
            if (!String.IsNullOrWhiteSpace(unit.RunningSettings.PriorityClass))
            {
                try{
                    unit.Process.PriorityClass = UnitManageModuleHelper.GetProcessPriorityClassFromString(unit.RunningSettings.PriorityClass);
                }catch (Exception exception) {
                    LoggerModuleHelper.TryLog(
                        "Modules.UnitManageModule.StartUnit[Error]", $"设置\"{unitKey}\"单元优先级异常,{exception.Message}\n异常堆栈: {exception.StackTrace}");
                }
            }
            if (!String.IsNullOrWhiteSpace(unit.RunningSettings.ProcessorAffinity))
            {
                Nullable <IntPtr> ptr = UnitManageModuleHelper.GetProcessorAffinityFormString(unit.RunningSettings.ProcessorAffinity);
                if (ptr.HasValue)
                {
                    try{
                        unit.Process.ProcessorAffinity = ptr.Value;
                    }catch (Exception exception) {
                        LoggerModuleHelper.TryLog(
                            "Modules.UnitManageModule.StartUnit[Error]", $"设置\"{unitKey}\"单元亲和性异常,{exception.Message}\n异常堆栈: {exception.StackTrace}");
                    }
                }
            }
            unit.Process.BeginOutputReadLine();
            unit.Process.BeginErrorReadLine();
            //unit.Process.StandardInput.AutoFlush=true;
            unit.ProcessId = unit.Process.Id;
            unit.State     = 2;
            if (unit.RunningSettings.MonitorPerformanceUsage && Program.UnitPerformanceCounterModule.Useable)
            {
                Program.UnitPerformanceCounterModule.Add(unit.ProcessId);
            }
            if (unit.RunningSettings.MonitorNetworkUsage && Program.UnitNetworkCounterModule.Useable)
            {
                _ = Program.UnitNetworkCounterModule.Add(unit.ProcessId);
            }
            if (Program.RemoteControlModule.Useable)
            {
                Program.RemoteControlModule.StartNotify(unit.Key);
            }
            LoggerModuleHelper.TryLog("Modules.UnitManageModule.StartUnit", $"已启动\"{unitKey}\"单元");
            return(unit.ProcessId);
        }