Exemplo n.º 1
0
        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}.");
            }
        }
Exemplo n.º 3
0
        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}].");
            }
        }
Exemplo n.º 4
0
        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);
            }
        }