Пример #1
0
        /// <summary>
        /// 运行脚本任务
        /// </summary>
        /// <param name="id">任务ID</param>
        /// <param name="scriptID">脚本流ID</param>
        /// <param name="err">错误信息</param>
        /// <returns></returns>
        private static bool RunScriptJob(long id, long scriptID, ref ErrorInfo err)
        {
            long scriptCaseID = 0;

            try
            {
                //先尝试取之前未完成的节点
                BLL.EM_SCRIPT_CASE.Entity scriptCaseEntity = BLL.EM_SCRIPT_CASE.Instance.GetRunningCase(scriptID);
                if (scriptCaseEntity != null)
                {
                    string msg = string.Format("脚本流【{0}】找到了之前未运行完成的实例【{1}】,本次手动任务将不会执行。", scriptID, scriptCaseEntity.ID);
                    WriteLog(scriptCaseEntity.ID, BLog.LogLevel.DEBUG, msg);
                    err.Message = msg;

                    //不用创建实例,不用执行
                    BLL.EM_HAND_RECORD.Instance.SetCancel(id, scriptCaseEntity.ID);
                    return(false);
                }
                else
                {
                    if (Flow.CreateScriptCase(scriptID, ref scriptCaseID, ref err, false) == true)
                    {
                        Main.CurMonitCount++;
                        //记录执行的任务ID
                        BLL.EM_HAND_RECORD.Instance.SetCaseID(id, scriptCaseID);
                        WriteLog(scriptCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】成功创建了新的实例【{1}】,等待执行。", scriptID, scriptCaseID));
                    }
                    else
                    {
                        //不能创建实例,取消执行
                        BLL.EM_HAND_RECORD.Instance.SetCancel(id, 0);
                        //标记为失败状态
                        if (scriptCaseID > 0)
                        {
                            BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                        }
                        WriteLog(scriptCaseID, BLog.LogLevel.WARN, err.Message);
                        return(false);
                    }
                }
            }
            catch (Exception ex)
            {
                WriteLog(scriptCaseID, BLog.LogLevel.ERROR, "创建脚本流实例发生了未知错误。" + ex.ToString());
                //不能创建实例,取消执行
                BLL.EM_HAND_RECORD.Instance.SetCancel(id, 0);
                //标记为失败状态
                if (scriptCaseID > 0)
                {
                    BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                }
                return(false);
            }

            return(true);
        }
Пример #2
0
        /// <summary>
        /// 到达时间点之后,执行具体任务(本方法由基类自动调用,不需要在外部来调用)
        /// </summary>
        /// <param name="runTime">当前时间点</param>
        /// <returns></returns>
        protected override bool Execute(DateTime runTime)
        {
            if (Main.IsRun == false)
            {
                WriteLog(0, BLog.LogLevel.INFO, string.Format("服务已经停止,脚本流【{0}】将不会执行任务。", ID));
                return(false);
            }

            //WriteLog(0, BLog.LogLevel.DEBUG, string.Format("脚本流【{0}】即将获取执行中的实例,如果有实例处于运行中,将不会创建新实例。", ID));

            var scr = BLL.EM_SCRIPT.Instance.GetScriptSupervene(ID);

            //WriteLog(0, BLog.LogLevel.DEBUG, string.Format("获取是否为并行任务。"));
            if (scr != null && scr.ID > 0)
            {
                WriteLog(0, BLog.LogLevel.DEBUG, string.Format("获取当前任务组【" + ID + "】为并行任务。"));
                try
                {
                    var ipNotLists = global.OpIpNotList("getall");
                    BLog.Write(BLog.LogLevel.INFO, "1输出未在线的ip:" + string.Join(",", ipNotLists.Select(p => p.V)));

                    int       effectCount = global.GetEffectMonitKVCount();
                    List <KV> kvs         = global.OpMonitKVList("getall");
                    WriteLog(0, BLog.LogLevel.INFO, string.Format("输出内存在写入的拷贝文件数:" + kvs.Count));
                    WriteLog(0, BLog.LogLevel.INFO, string.Format("输出有效的待拷贝文件数:" + effectCount));
                    if (effectCount > 0)
                    {
                    }
                    else
                    {
                        WriteLog(0, BLog.LogLevel.INFO, string.Format("并行任务【自动上传文件】无待上传文件,将不创建任务组实例"));
                        return(false);
                    }
                    #region 判断监控文件表中是否有待处理的monit_file. 没有将跳出任务组实例的创建--作废
                    //                   //string sql = string.Format(@"select count(1) from FM_MONIT_FILE where COPY_STATUS=0 or COPY_STATUS=3");
                    //                   #region 再次验证和清理未在线终端
                    //                   //var ipArr = global.ipList.ToArray();
                    //                   //for (int i = 0; i < ipArr.Count(); i++)
                    //                   //{
                    //                   //    if (Request.PingIP(ipArr[i].Value) && global.ipList.ContainsKey(ipArr[i].Key))
                    //                   //    {
                    //                   //        global.ipList.Remove(ipArr[i].Key);//移除已在线的终端
                    //                   //    }
                    //                   //}
                    //                   var ipNotLists = global.OpIpNotList("getall");
                    //                   if (ipNotLists != null && ipNotLists.Count > 0)
                    //                   {
                    //                       int cnt = ipNotLists.Count;
                    //                       for (int i = cnt - 1; i >= 0; i--)
                    //                       {
                    //                           var item = ipNotLists[i];
                    //                           if (Librarys.ApiRequest.Request.PingIP(item.V))
                    //                           {
                    //                               global.OpIpNotList("remove", item);
                    //                           }
                    //                       }
                    //                       ipNotLists = global.OpIpNotList("getall");

                    //                   }
                    //                   #endregion
                    //                   string sql = string.Format(@"       SELECT ID, COMPUTER_ID
                    // FROM (SELECT A.ID, A.COMPUTER_ID, ROW_NUMBER () OVER (ORDER BY A.ID) RN
                    //         FROM FM_MONIT_FILE A
                    //              LEFT JOIN
                    //              (    SELECT DISTINCT REGEXP_SUBSTR ('{0}',
                    //                                                  '[^,]+',
                    //                                                  1,
                    //                                                  LEVEL)
                    //                                      AS COMPUTER_ID
                    //                     FROM DUAL
                    //               CONNECT BY REGEXP_SUBSTR ('{0}',
                    //                                         '[^,]+',
                    //                                         1,
                    //                                         LEVEL)
                    //                             IS NOT NULL) C
                    //                 ON (A.COMPUTER_ID = C.COMPUTER_ID)
                    //            LEFT JOIN FM_FILE_FORMAT F ON (F.ID=A.FILE_FORMAT_ID)
                    //        WHERE     NVL (C.COMPUTER_ID, 0) = 0  AND F.NAME<>'Folder'
                    //              AND (A.COPY_STATUS = 0 OR A.COPY_STATUS = 3))
                    //WHERE RN <={1}", string.Join(",", ipNotLists.Select(p => p.K).Distinct()), Main.EachSearchUploadCount);

                    //                   //string sql = string.Format(@"  SELECT A.ID,A.COMPUTER_ID
                    //                   //            FROM FM_MONIT_FILE A
                    //                   //             LEFT JOIN FM_file_FORMAT F ON A.FILE_FORMAT_ID=F.ID
                    //                   //           WHERE     (A.COPY_STATUS = 0 OR A.COPY_STATUS = 3) and F.NAME<>'Folder'
                    //                   //                 AND ( ({0} = 0) OR ({0} > 0 AND A.COMPUTER_ID NOT IN ({1})))
                    //                   //                 AND ROWNUM <= {2}
                    //                   //        ORDER BY A.ID", ipNotLists.Count,
                    //                   //               ipNotLists.Count == 0 ? "0" : string.Join(",", ipNotLists.Select(p => p.K).Distinct()), Main.EachSearchUploadCount);
                    //                   DataTable dt = null;
                    //                   using (BDBHelper dbop = new BDBHelper())
                    //                   {
                    //                       dt = dbop.ExecuteDataTable(sql);
                    //                   }
                    //                   if (dt != null && dt.Rows.Count > 0)
                    //                   { }
                    //                   else
                    //                   {
                    //                       WriteLog(0, BLog.LogLevel.INFO, string.Format("并行任务【自动上传文件】无待上传文件,将不创建任务组实例", string.Format("执行的sql语句为:{0}", sql), ID));
                    //                       return false;
                    //                   }
                    #endregion
                }
                catch (Exception ex)
                {
                    WriteLog(0, BLog.LogLevel.INFO, string.Format("监控错误:{0}", ex.Message));
                    return(false);
                }

                lock (this)
                {
                    int curNum = 0;
                    WriteLog(0, BLog.LogLevel.DEBUG, string.Format("在创建脚本流实例前的判断:curNum{0},MaxUploadCount{1},已CurUploadCount{2}。", curNum, Main.MaxUploadCount.ToString(), Main.CurUploadCount));
                    while (curNum < Main.MaxUploadCount && Main.CurUploadCount < Main.MaxUploadCount)
                    {
                        WriteLog(0, BLog.LogLevel.DEBUG, string.Format("curNum{0},MaxUploadCount{1},已有的上传CurUploadCount{2}。", curNum, Main.MaxUploadCount.ToString(), Main.CurUploadCount));
                        long scriptCaseID = 0;
                        try
                        {
                            //先尝试取之前未完成的节点(排除并发任务组)+执行中的任务实例
                            //BLL.EM_SCRIPT_CASE.Entity scriptCaseEntity = BLL.EM_SCRIPT_CASE.Instance.GetRunningCase(ID);
                            //if (scriptCaseEntity != null)
                            //{
                            //    WriteLog(scriptCaseEntity.ID, BLog.LogLevel.DEBUG, string.Format("脚本流【{0}】找到了之前未运行完成的实例【{1}】,本次任务将不会创建新实例。", ID, scriptCaseEntity.ID));
                            //    return false;
                            //}
                            //else
                            //{
                            ErrorInfo err = new ErrorInfo();

                            if (CreateScriptCase(ID, ref scriptCaseID, ref err) == true)
                            {
                                WriteLog(scriptCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】成功创建了新的实例【{1}】,等待执行。", ID, scriptCaseID));
                                Main.CurUploadCount++;
                            }
                            else
                            {
                                WriteLog(scriptCaseID, BLog.LogLevel.WARN, err.Message);
                                //标记为失败状态
                                if (scriptCaseID > 0)
                                {
                                    BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                                }
                                return(false);
                            }
                            //}


                            //_dicTaskers.Add(ID, null);
                        }
                        catch (Exception ex)
                        {
                            WriteLog(scriptCaseID, BLog.LogLevel.WARN, "创建脚本流实例发生了未知错误。" + ex.ToString());
                            //标记为失败状态
                            if (scriptCaseID > 0)
                            {
                                BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                            }
                            return(false);
                        }
                        curNum++;
                    }
                }
            }
            else
            {
                #region
                long scriptCaseID = 0;
                try
                {
                    //先尝试取之前未完成的节点(排除并发任务组)+执行中的任务实例
                    BLL.EM_SCRIPT_CASE.Entity scriptCaseEntity = BLL.EM_SCRIPT_CASE.Instance.GetRunningCase(ID);
                    if (scriptCaseEntity != null)
                    {
                        WriteLog(scriptCaseEntity.ID, BLog.LogLevel.DEBUG, string.Format("脚本流【{0}】找到了之前未运行完成的实例【{1}】,本次任务将不会创建新实例。", ID, scriptCaseEntity.ID));
                        return(false);
                    }
                    else
                    {
                        ErrorInfo err = new ErrorInfo();

                        if (CreateScriptCase(ID, ref scriptCaseID, ref err, false) == true)
                        {
                            WriteLog(scriptCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】成功创建了新的实例【{1}】,等待执行。", ID, scriptCaseID));
                        }
                        else
                        {
                            WriteLog(scriptCaseID, BLog.LogLevel.WARN, err.Message);
                            //标记为失败状态
                            if (scriptCaseID > 0)
                            {
                                BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                            }
                            return(false);
                        }
                    }
                }
                catch (Exception ex)
                {
                    WriteLog(scriptCaseID, BLog.LogLevel.WARN, "创建脚本流实例发生了未知错误。" + ex.ToString());
                    //标记为失败状态
                    if (scriptCaseID > 0)
                    {
                        BLL.EM_SCRIPT_CASE.Instance.SetFail(scriptCaseID);
                    }
                    return(false);
                }
                #endregion
            }


            return(true);
        }
Пример #3
0
        /// <summary>
        /// 生成代码、编译及运行
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void DoWork(object sender, DoWorkEventArgs e)
        {
            int       reTryTimes = 0;//初始化为0
            List <KV> monitList  = null;

            while (Main.IsRun)
            {
                try
                {
                    ErrorInfo err  = new ErrorInfo();
                    string    code = Script.Transfer.Trans(_nodeCaseEntity, ref err);
                    if (err.IsError == true)
                    {
                        WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】生成脚本代码失败,错误信息为:\r\n{4}", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID, err.Message));
                        //从内存记录中移除
                        Main.RemoveNodeTask(_nodeCaseEntity.ID);
                        return;
                    }
                    BLL.EM_SCRIPT_CASE.Entity entityScriptCase = BLL.EM_SCRIPT_CASE.Instance.GetCase(_nodeCaseEntity.SCRIPT_CASE_ID);
                    //如果是并行任务,文件拷贝
                    if (entityScriptCase.IS_SUPERVENE == 1)
                    {
                        monitList = GetMonitList();
                        string monitIds = "空";
                        if (monitList != null && monitList.Count() > 0)
                        {
                            monitIds = string.Join(",", monitList);
                        }
                        //log(string.Format("成功赋值文件列表:" + monitIds));
                    }
                    //保存源代码到数据库lcz*****
                    int i = BLL.EM_SCRIPT_NODE_CASE.Instance.UpdateCompileContent(_nodeCaseEntity.ID, code);

                    if (entityScriptCase.IS_SUPERVENE == 1 && (monitList == null || monitList.Count() == 0))
                    {
                        BLL.EM_SCRIPT_NODE_CASE.Instance.SetStop(_nodeCaseEntity.ID, Enums.ReturnCode.Warn.GetHashCode());
                        Main.RemoveNodeTask(_nodeCaseEntity.ID);
                        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;
                    }
                    bool isSuccess = Script.Execute.NewRun(code, _nodeCaseEntity, monitList, ref err);
                    if (isSuccess)
                    {
                        //结束运行状态
                        if (err.IsWarn)
                        {
                            BLL.EM_SCRIPT_NODE_CASE.Instance.SetStop(_nodeCaseEntity.ID, Enums.ReturnCode.Warn.GetHashCode());
                        }
                        else
                        {
                            BLL.EM_SCRIPT_NODE_CASE.Instance.SetStop(_nodeCaseEntity.ID, Enums.ReturnCode.Success.GetHashCode());
                        }
                        WriteLog(_scriptNodeCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】已经成功执行。预警状态:{4}", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID, err.IsWarn.ToString()));
                        //从内存记录中移除
                        Main.RemoveNodeTask(_nodeCaseEntity.ID);

                        if (monitList != null && monitList.Count > 0)
                        {
                            global.OpMonitKVList("remove", null, 0, monitList);
                        }
                        return;
                    }
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.INFO, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】执行失败;失败信息:{4}", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID, err.Message.ToString()));
                    //记录重试次数
                    reTryTimes = BLL.EM_SCRIPT_NODE_CASE.Instance.RecordTryTimes(_nodeCaseEntity.ID);

                    //超过最大尝试次数
                    if (reTryTimes >= _maxTryTimes)
                    {
                        WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】作了最后一次尝试,仍然执行失败,本脚本流将不再执行。", _nodeCaseEntity.SCRIPT_ID, _nodeCaseEntity.SCRIPT_CASE_ID, _nodeCaseEntity.SCRIPT_NODE_ID, _nodeCaseEntity.ID));

                        BLL.EM_SCRIPT_NODE_CASE.Instance.SetStop(_nodeCaseEntity.ID, Enums.ReturnCode.Fail.GetHashCode());
                        //BLL.EM_SCRIPT_CASE.Instance.SetFail(_nodeCaseEntity.SCRIPT_CASE_ID);
                        //Main.CurUploadCount--;

                        //从内存记录中移除
                        Main.RemoveNodeTask(_nodeCaseEntity.ID);
                        if (monitList != null && monitList.Count > 0)
                        {
                            global.OpMonitKVList("remove", null, 0, monitList);
                        }
                        return;
                    }
                    else
                    {
                        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, reTryTimes));
                    }
                }
                catch (Exception ex)
                {
                    WriteLog(_scriptNodeCaseID, BLog.LogLevel.WARN, string.Format("执行节点实例【{0}】出现了未知异常,错误信息为:\r\n{1}", _scriptNodeCaseID, ex.ToString()));
                    BLL.EM_SCRIPT_NODE_CASE.Instance.SetStop(_nodeCaseEntity.ID, Enums.ReturnCode.Fail.GetHashCode());
                    //BLL.EM_SCRIPT_CASE.Instance.SetFail(_nodeCaseEntity.SCRIPT_CASE_ID);
                    //从内存记录中移除
                    Main.RemoveNodeTask(_nodeCaseEntity.ID);
                    if (monitList != null && monitList.Count > 0)
                    {
                        global.OpMonitKVList("remove", null, 0, monitList);
                    }
                    //Main.CurUploadCount--;
                    return;
                }
            }
        }