public void Initialize(Process process, ResourceDicModel <string> resourceDic) { try { _processInstanceRecord = new ProcessInstanceRecord { ProcessName = ProcessName, Pid = Pid, StartTime = DateTime.Now }; _processInstanceRecord.Messages.Add(new Message { Description = $"Pid: [{Pid}]" }); //将主流程调用时选定的资源名同步到ProcessInstance当中。 if (resourceDic != null) { ProcessParameterManager.GetDictionaryParam(resourceDic.ResourceDictionaryName) .Replace(resourceDic.DictionaryParameter); } foreach (var processStep in process.Steps) { var step = processStep.Value.CreateInstance(ProcessParameterManager); step.OwnerProcessInstance = this; Steps.Add(processStep.Key, step); } } catch (Exception e) { Log.Error($"ProcessInstance进行初始化失败,{e.Message}"); } }
/// <summary> /// 记录Process历史记录 /// </summary> /// <param name="processInstanceRecord"></param> public static void LogProcessInstance(ProcessInstanceRecord processInstanceRecord) { try { var recordDirectoryInfo = new DirectoryInfo(FreeSqlUtil.BaseDirectory); if (!recordDirectoryInfo.Exists) { recordDirectoryInfo.Create(); } lock (ThreadLocker) { var baseRepository = FreeSqlUtil.FSql.GetRepository <ProcessInstanceRecord>(); baseRepository.DbContextOptions.EnableAddOrUpdateNavigateList = true; baseRepository.Insert(processInstanceRecord); } } catch (Exception e) { Log.Error( $"记录完成的过程实例数据失败,记录的Process为[{processInstanceRecord.ProcessName}],异常为:[{e.Message},{e.StackTrace}]\n {e.InnerException}."); } }
public static void LogProcessInstance(ProcessInstanceRecord processInstanceRecord) { try { lock (ThreadLocker) { //var processInstanceRecords = ReadProcessRecord("TaskOneMainProcess", 10); var fileInfos = ProcessRecordFileInfos(); string processLogFileName; //目录下没有任何的xml日志,则创建xml日志 if (!fileInfos.Any()) { processLogFileName = BaseDirectory + "\\ProcessLog~01.xml"; WriteToFile(processLogFileName, processInstanceRecord, FileMode.Create); return; } //目录下存在xml,将Process执行日志记录到最后修改的文件中。 if (fileInfos[0].Length < 1024 * 1024 * 10 /*10M文本大小*/) { processLogFileName = fileInfos[0].FullName; WriteToFile(processLogFileName, processInstanceRecord, FileMode.Append); return; } var substring = fileInfos[0].Name.Substring("ProcessLog~".Length, 2); int.TryParse(substring, out var logIndex); //如果文档大于10M则向下一个文档中记录数据 if (logIndex < 30) { logIndex++; var logIndexString = logIndex >= 10 ? logIndex.ToString() : "0" + logIndex; processLogFileName = BaseDirectory + $"\\ProcessLog~{logIndexString}.xml"; //如果不存在该文件,则创建一个新的文档 WriteToFile(processLogFileName, processInstanceRecord, FileMode.Create); return; } //达到日志记录数量上限,从头开始记录 processLogFileName = BaseDirectory + "\\ProcessLog~01.xml"; WriteToFile(processLogFileName, processInstanceRecord, FileMode.Create); } } catch (Exception e) { Log.Error($"记录完成的过程实例数据失败,记录的Process为[{processInstanceRecord.ProcessName}],异常为:[{e.Message}]."); } }
private static void WriteToFile(string processLogFileName, ProcessInstanceRecord processRecord, FileMode fileMode) { var doc = new XmlDocument(); switch (fileMode) { case FileMode.CreateNew: break; case FileMode.Create: // 创建XML文档,存在就删除再生成 var dec = doc.CreateXmlDeclaration("1.0", "GB2312", null); doc.AppendChild(dec); // 创建根结点 var root = doc.CreateElement("root"); doc.AppendChild(root); AddProcessRecord(doc); break; case FileMode.Open: break; case FileMode.OpenOrCreate: break; case FileMode.Truncate: break; case FileMode.Append: doc.Load(processLogFileName); AddProcessRecord(doc); break; default: throw new ArgumentOutOfRangeException(nameof(fileMode), fileMode, null); } doc.Save(processLogFileName); void AddProcessRecord(XmlDocument xmlDoc) { var root = xmlDoc.SelectSingleNode("root"); var processInstanceRecord = xmlDoc.CreateElement("ProcessInstanceRecord"); processInstanceRecord.SetAttribute("ProcessName", processRecord.ProcessName); processInstanceRecord.SetAttribute("Pid", processRecord.Pid); processInstanceRecord.SetAttribute("StartTime", processRecord.StartTime.ToString(CultureInfo.InvariantCulture)); processInstanceRecord.SetAttribute("EndTime", processRecord.EndTime.ToString(CultureInfo.InvariantCulture)); processInstanceRecord.SetAttribute("ProcessStatus", processRecord.ProcessStatus.ToString()); processInstanceRecord.SetAttribute("BreakStepId", processRecord.BreakStepId.ToString()); processInstanceRecord.SetAttribute("BreakStepName", processRecord.BreakStepName); var exceptions = xmlDoc.CreateElement("Exceptions"); foreach (var exception in processRecord.Messages) { var exceptionNode = xmlDoc.CreateElement("string"); exceptionNode.InnerText = exception.Description; exceptions.AppendChild(exceptionNode); } var parameters = xmlDoc.CreateElement("Parameters"); foreach (var parameterInfo in processRecord.Parameters) { var parameterNode = xmlDoc.CreateElement("ParameterInfo"); parameterNode.SetAttribute("Name", parameterInfo.Name); parameterNode.SetAttribute("ValueInString", parameterInfo.ValueInString); parameterNode.SetAttribute("Type", parameterInfo.Type); parameterNode.SetAttribute("Key", parameterInfo.Key); parameters.AppendChild(parameterNode); } processInstanceRecord.AppendChild(exceptions); processInstanceRecord.AppendChild(parameters); root?.AppendChild(processInstanceRecord); } }