Esempio n. 1
0
        /// <summary>
        /// 执行节点实例代码内容
        /// </summary>
        /// <param name="cr"></param>
        /// <param name="nodeCase"></param>
        /// <param name="err"></param>
        public static bool ExcuteScriptCaseCode(CompilerResults cr, BLL.EM_SCRIPT_NODE_CASE.Entity nodeCase, ref ErrorInfo err)
        {
            // 通过反射,调用函数
            Assembly objAssembly = cr.CompiledAssembly;

            object objScripRunner = objAssembly.CreateInstance("Easyman.ScriptService.Script.ScripRunner");

            if (objScripRunner == null)
            {
                err.IsError = true;
                err.Message = "不能创建脚本的运行实例。";
                return(false);
            }

            //初始化节点实例相关数据Initialize()
            var initialize = objScripRunner.GetType().GetMethod("SetScriptNodeCaseID").Invoke(objScripRunner, new object[] { nodeCase.ID });

            //设置启动数据库编号
            var setnowdb = objScripRunner.GetType().GetMethod("setnowdbid").Invoke(objScripRunner, new object[] { nodeCase.DB_SERVER_ID });

            //运行脚本
            var run = objScripRunner.GetType().GetMethod("Run").Invoke(objScripRunner, null);

            #region   获取错误信息GetErr()

            //外部job需要接收内部错误信息
            //用于判断重试次数、用于是否再执行
            var errorMsg = objScripRunner.GetType().GetMethod("GetErrorMessage").Invoke(objScripRunner, null);
            if (string.IsNullOrEmpty(errorMsg.ToString()) == false)
            {
                err.IsError = true;
                err.Message = errorMsg.ToString();
                return(false);
            }
            else
            {
                var warnMsg = objScripRunner.GetType().GetMethod("GetWarnMessage").Invoke(objScripRunner, null);
                if (string.IsNullOrEmpty(warnMsg.ToString()) == false)
                {
                    err.IsError = false;
                    err.Message = warnMsg.ToString();
                    err.IsWarn  = true;
                }
                return(true);
            }


            #endregion
        }
Esempio n. 2
0
        /// <summary>
        /// 运行脚本
        /// </summary>
        /// <param name="code">脚本代码</param>
        /// <param name="nodeCase">节点实例</param>
        /// <param name="err">错误信息</param>
        /// <returns></returns>
        public static bool Run(string code, BLL.EM_SCRIPT_NODE_CASE.Entity nodeCase, ref ErrorInfo err)
        {
            //动态编译
            CompilerResults cr = CompilerClass(code, ref err);

            if (cr == null)
            {
                BLL.EM_SCRIPT_NODE_CASE_LOG.Instance.Add(nodeCase.ID, 3, "节点脚本编译失败:\r\n" + err.Message, code);
                return(false);
            }
            BLL.EM_SCRIPT_NODE_CASE_LOG.Instance.Add(nodeCase.ID, 4, "节点脚本编译成功", "");

            //调用必备函数+执行实例代码
            return(ExcuteScriptCaseCode(cr, nodeCase, ref err));
        }
Esempio n. 3
0
        public static bool NewRun(string code, BLL.EM_SCRIPT_NODE_CASE.Entity nodeCase, List <KV> monitList, ref ErrorInfo err)
        {
            //动态编译
            string dllName = NewCompilerClass(code, nodeCase.SCRIPT_NODE_ID.ToString(), ref err);

            if (string.IsNullOrEmpty(dllName))
            {
                BLL.EM_SCRIPT_NODE_CASE_LOG.Instance.Add(nodeCase.ID, 3, "节点脚本编译失败:\r\n" + err.Message, code);
                return(false);
            }
            BLL.EM_SCRIPT_NODE_CASE_LOG.Instance.Add(nodeCase.ID, 4, "节点脚本编译成功:" + dllName, "");

            //调用必备函数+执行实例代码
            return(NewExcuteScriptCaseCode(dllName, nodeCase, monitList, ref err));
        }
Esempio n. 4
0
        /// <summary>
        /// 运行节点实例(不支持单独新建节点实例,只支持对失败节点实例再启动)
        /// </summary>
        /// <param name="scriptNodeID">节点ID</param>
        /// <param name="err">错误信息</param>
        private static bool RunNodeJob(long id, long scriptNodeID, ref ErrorInfo err, long?nodeCaseId = null)
        {
            int i = 0;

            try
            {
                BLL.EM_SCRIPT_NODE_CASE.Entity nodeCaseEntity = null;
                if (nodeCaseId == null)
                {
                    nodeCaseEntity = BLL.EM_SCRIPT_NODE_CASE.Instance.GetFailCase(scriptNodeID);
                }
                else
                {
                    nodeCaseEntity = BLL.EM_SCRIPT_NODE_CASE.Instance.GetNodeCase(nodeCaseId.Value);
                }
                //BLL.EM_SCRIPT_NODE_CASE.Entity nodeCaseEntity = BLL.EM_SCRIPT_NODE_CASE.Instance.GetNodeCase(scriptNodeID);
                if (nodeCaseEntity == null)
                {
                    err.IsError = true;
                    err.Message = string.Format("执行节点【{0}】的手动任务,当前没有该节点的失败节点(或未查找到实例对象)可以执行,因此本次任务已经取消。", scriptNodeID);
                    //设置为“取消执行”状态,无具体实例对应
                    i = BLL.EM_HAND_RECORD.Instance.SetCancel(id, 0, err.Message);

                    return(false);
                }

                //记录执行的任务ID(将处理后的手工改为已处理状态)
                i = BLL.EM_HAND_RECORD.Instance.SetCaseID(id, nodeCaseEntity.ID);

                Node node = new Node(nodeCaseEntity.ID, 1);
                node.Start();
                BLog.Write(BLog.LogLevel.INFO, string.Format("节点【{0}】的手动任务的实例【{1}】已经被执行。", scriptNodeID, nodeCaseEntity.ID));
            }
            catch (Exception ex)
            {
                err.IsError = true;
                err.Message = string.Format("执行节点【{0}】的手动任务【{1}】失败。{2}", scriptNodeID, id, ex.ToString());
                return(false);
            }

            return(true);
        }
Esempio n. 5
0
        /// <summary>
        /// 转换脚本
        /// </summary>
        /// <param name="nodeCaseEntity">节点实例</param>
        /// <param name="err">错误信息</param>
        /// <returns>转换后的脚本</returns>
        public static string Trans(BLL.EM_SCRIPT_NODE_CASE.Entity nodeCaseEntity, ref ErrorInfo err)
        {
            if (nodeCaseEntity == null)
            {
                return(string.Empty);
            }

            string code      = nodeCaseEntity.CONTENT;
            string functions = string.Empty;

            try
            {
                //若为创建表,替换表名
                if (nodeCaseEntity.SCRIPT_MODEL == (short)Enums.ScriptModel.CreateTb)
                {
                    code = TransCreateTable(code, nodeCaseEntity.E_TABLE_NAME, nodeCaseEntity.TABLE_SUFFIX, nodeCaseEntity.TABLE_TYPE);
                }

                //替换当前脚本流实例涉及的节点~表(公、私)
                code = ReplaceTableNames(nodeCaseEntity.SCRIPT_CASE_ID, code);

                //替换自定义函数
                code = ReplaceFunctions('@', code);

                //拼凑自定义函数字符串(代码暂未实现)
                functions = BLL.EM_SCRIPT_FUNCTION.Instance.GetAllFunctionsToString();

                //拼凑节点执行代码块
                return(GenerateCode(code, functions));
            }
            catch (Exception ex)
            {
                err.IsError = true;
                err.Message = string.Format("脚本流【{0}】的实例【{1}】中的节点【{2}】的实例【{3}】转换脚本,错误信息为:\r\n{3}\r\n原始脚本代码为:\r\n{4}", nodeCaseEntity.SCRIPT_ID, nodeCaseEntity.SCRIPT_CASE_ID, nodeCaseEntity.SCRIPT_NODE_ID, nodeCaseEntity.ID, ex.ToString(), code);
                return(string.Empty);
            }
        }
Esempio n. 6
0
        public static bool NewExcuteScriptCaseCode(string dllName, BLL.EM_SCRIPT_NODE_CASE.Entity nodeCase, List <KV> monitList, ref ErrorInfo err)
        {
            bool resBool = true;

            // string dllPath = dllName;
            // AppDomain ad = AppDomain.CurrentDomain;

            // ProxyObject obj = (ProxyObject)ad.CreateInstanceFromAndUnwrap(System.AppDomain.CurrentDomain.BaseDirectory + "Easyman.ScriptService.exe", "Easyman.ScriptService.Script.ProxyObject");
            // obj.LoadAssembly(dllPath);
            // resBool=obj.Invoke("Easyman.ScriptService.Script.ScripRunner", nodeCase.ID, nodeCase.DB_SERVER_ID);
            //// AppDomain.Unload(ad);
            //DoAbsoluteDeleteFile(dllName, ref err);
            #region 原模式

            AppDomain        objAppDomain = null;
            IRemoteInterface objRemote    = null;
            try
            {
                // 0. Create an addtional AppDomain
                //AppDomainSetup objSetup = new AppDomainSetup();
                //objSetup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
                //objAppDomain = AppDomain.CreateDomain("MyAppDomain", null, objSetup);



                objAppDomain = AppDomain.CreateDomain("Domain_" + DateTime.Now.Ticks.ToString());//.CurrentDomain;

                // 4. Invoke the method by using Reflection
                RemoteLoaderFactory factory = (RemoteLoaderFactory)objAppDomain.CreateInstance("Easyman.ScriptService", "RemoteAccess.RemoteLoaderFactory").Unwrap();

                // with help of factory, create a real 'LiveClass' instance
                object objObject = factory.Create(dllName, "Easyman.ScriptService.Script.ScripRunner", null);

                if (objObject == null)
                {
                    resBool     = false;
                    err.IsError = true;
                    err.Message = "创建实例【Easyman.ScriptService.Script.ScripRunner】失败";
                }

                // *** Cast object to remote interface, avoid loading type info
                objRemote = (IRemoteInterface)objObject;

                //初始化节点实例相关数据Initialize()
                objRemote.Invoke("SetScriptNodeCaseID", new object[] { nodeCase.ID });
                //设置启动数据库编号
                //objRemote.Invoke("setnowdbid", new object[] { nodeCase.DB_SERVER_ID });

                //设置待拷贝文件编号
                if (monitList != null && monitList.Count() > 0)
                {
                    objRemote.Invoke("SetMonitFileList", new object[] { monitList.Select(p => p.K).ToList() });
                }
                //运行脚本
                objRemote.Invoke("Run", null);

                #region   获取错误信息GetErr()

                //外部job需要接收内部错误信息
                //用于判断重试次数、用于是否再执行
                var errorMsg = (string)objRemote.Invoke("GetErrorMessage", null);

                if (!string.IsNullOrEmpty(errorMsg.ToString()))
                {
                    err.IsError = true;
                    err.Message = errorMsg.ToString();
                    resBool     = false;
                }
                else
                {
                    var warnMsg = (string)objRemote.Invoke("GetWarnMessage", null);
                    if (!string.IsNullOrEmpty(warnMsg.ToString()))
                    {
                        err.IsError = false;
                        err.Message = warnMsg.ToString();
                        err.IsWarn  = true;
                    }
                }

                ////Dispose the objects and unload the generated DLLs.
                //objRemote = null;
                //AppDomain.Unload(objAppDomain);
                //System.IO.File.Delete(dllName);

                #endregion
            }
            catch (Exception ex)
            {
                resBool     = false;
                err.IsError = true;
                err.Message = ex.Message;
            }
            finally
            {
                //Dispose the objects and unload the generated DLLs.
                //objRemote = null;
                AppDomain.Unload(objAppDomain);
                // System.IO.File.Delete(dllName);
                DoAbsoluteDeleteFile(dllName, ref err);
            }

            //     BLL.EM_SCRIPT_NODE_CASE_LOG.Instance.Add(nodeCase.ID, 3, "执行错误:\r\n" + err.Message,"");
            #endregion
            return(resBool);
        }
Esempio n. 7
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);
        }