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