Ejemplo n.º 1
0
        /// <summary>
        /// 开始执行任务
        /// </summary>
        /// <param name="isLastNodeCase">是否为程序上次运行添加的节点实例,这种节点可能正处于运行中程序被停止了</param>
        /// <returns></returns>
        public bool Start(bool isLastNodeCase = false)
        {
            try
            {
                //验证运行节点实例数量
                if (Main.RunningNodeCount >= Main.MaxExecuteNodeCount)
                {
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("当前已经有【{0}】个节点实例运行,超过系统设定的最大数【{1}】,本节点实例将暂时不被执行。", Main.RunningNodeCount, Main.MaxExecuteNodeCount));
                    return(false);
                }

                //读取当前节点
                _nodeCaseEntity = BLL.EM_SCRIPT_NODE_CASE.Instance.GetEntityByKey <BLL.EM_SCRIPT_NODE_CASE.Entity>(_scriptNodeCaseID);

                if (_nodeCaseEntity == null)
                {
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("没有获取脚本流节点实例ID【{0}】的实体对象,将不被执行。", _scriptNodeCaseID));
                    return(false);
                }

                //已经停止的节点,不再执行
                if (_nodeCaseEntity.RUN_STATUS == (short)Enums.RunStatus.Stop)
                {
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态为【停止】,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID));
                    return(false);
                }

                //当前状态不等于等待执行
                if (_nodeCaseEntity.RUN_STATUS != (short)Enums.RunStatus.Wait)
                {
                    //上次未完成的节点实例,可以继续执行
                    if (isLastNodeCase == false)
                    {
                        WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态不为【等待执行】,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID));
                        return(false);
                    }
                }

                //添加到内存
                if (Main.AddNodeTask(_scriptNodeCaseID) == false)
                {
                    //WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】已经于【{4}】开始运行,本次将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID, Main.GetNodeTaskStartTime(_scriptNodeCaseID).ToString("yyyy-MM-dd HH:mm:ss.fff")));
                    return(false);
                }

                //更新当前节点状态
                int i = BLL.EM_SCRIPT_NODE_CASE.Instance.UpdateRunStatus(_scriptNodeCaseID, Enums.RunStatus.Excute);
                if (i < 0)
                {
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("更新脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态为【执行中】失败,本节点将不被执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID));
                    return(false);
                }

                WriteLog(_scriptNodeCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】的运行状态已经更新为【执行中】,下面将执行节点脚本内容。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID));

                _bw = new BackgroundWorker();
                _bw.WorkerSupportsCancellation = true;
                _bw.DoWork += DoWork;
                _bw.RunWorkerAsync();
            }
            catch (Exception ex)
            {
                WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("执行节点实例【{0}】出现了未知异常,1错误信息为:\r\n{1}", _scriptNodeCaseID, ex.ToString()));
                return(false);
            }

            return(true);
        }