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