예제 #1
0
        public NodeTaskRunTimeInfo Create(string taskid)
        {
            NodeTaskRunTimeInfo taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString());

            if (taskruntimeinfo != null)
            {
                throw new Exception("任务已在运行中");
            }
            taskruntimeinfo          = new NodeTaskRunTimeInfo();
            taskruntimeinfo.TaskLock = new TaskLock();
            // taskruntimeinfo.TaskModel = task;

            return(taskruntimeinfo);
        }
예제 #2
0
        //[DllImport("psapi.dll")]
       // public static extern int EmptyWorkingSet(IntPtr hwProc);

        /// <summary>
        /// 任务的资源释放
        /// </summary>
        /// <param name="taskid"></param>
        /// <param name="taskruntimeinfo"></param>
        /// <returns></returns>
        public static bool DisposeTask(int taskid, NodeTaskRunTimeInfo taskruntimeinfo, bool isforceDispose,Action<string> ShowCommandLog)
        {
            try
            {
                if (taskruntimeinfo != null && taskruntimeinfo.DllTask != null)
                    try { taskruntimeinfo.DllTask = null; }
                    catch (Exception ex)
                    {
                        if (ShowCommandLog != null)
                        {
                            ShowCommandLog("强制资源释放之任务资源释放异常,异常信息:" + JsonConvert.SerializeObject(ex));
                            LogProxy.AddTaskErrorLog("强制资源释放之任务资源释放异常,异常信息:" + JsonConvert.SerializeObject(ex), taskid);
                        }
                    }
                if (taskruntimeinfo != null && taskruntimeinfo.Domain != null)
                    try { 
                        new AppDomainLoaderHelper<AbstractTask>().UnLoad(taskruntimeinfo.Domain); 
                        taskruntimeinfo.Domain = null;
                        GC.Collect();
                    }
                    catch (Exception e)
                    {
                        if (ShowCommandLog != null)
                        {
                            ShowCommandLog("强制资源释放之应用程序域释放异常,异常信息:" + JsonConvert.SerializeObject(e));
                            LogProxy.AddTaskErrorLog("强制资源释放之应用程序域释放异常,异常信息:" + JsonConvert.SerializeObject(e), taskid);
                        }
                    }
                if (TaskPoolManager.CreateInstance().Get(taskid.ToString()) != null)
                    try { TaskPoolManager.CreateInstance().Remove(taskid.ToString()); }
                    catch (Exception e)
                    {
                        if (ShowCommandLog != null)
                        {
                            ShowCommandLog("强制资源释放之任务池释放异常,异常信息:" + JsonConvert.SerializeObject(e));
                            LogProxy.AddTaskErrorLog("强制资源释放之任务池释放异常,异常信息:" + JsonConvert.SerializeObject(e), taskid);
                        }
                    }
                if (ShowCommandLog != null) ShowCommandLog("节点已对任务进行资源释放完成,任务id:" + taskid);
                return true;
            }
            catch(Exception ex)
            {
                LogProxy.AddTaskErrorLog("释放任务资源异常,异常信息:" + JsonConvert.SerializeObject(ex), taskid);
                return false;
            }
        }
예제 #3
0
 private static void Alaram(UpdateTaskExecuteLogRequest req2, NodeTaskRunTimeInfo task, AbstractTask abstracttask)
 {
     if (task.TaskModel.isenablealarm == 1)
     {
         string        alarmperson = task.TaskModel.alarmtype == (int)AlarmType.Email ? abstracttask.GetAlarmEmailList() : abstracttask.GetAlarmMobileList();
         string        title       = "任务名称(" + task.TaskModel.taskname + ")" + req2.RunStatus.description() + ",请及时处理!";
         StringBuilder strContent  = new StringBuilder();
         strContent.AppendLine("所在节点名称(编号):" + GlobalNodeConfig.NodeInfo.nodename + "(" + GlobalNodeConfig.NodeID + ")<br/>");
         strContent.AppendLine("任务名称(编号):" + task.TaskModel.taskname + "(" + task.TaskModel.id + ")<br/>");
         strContent.AppendLine("任务类型:" + ((TaskType)task.TaskModel.tasktype).description() + "<br/>");
         strContent.AppendLine("任务执行参数:" + task.TaskVersionModel.taskparams + "<br/>");
         strContent.AppendLine("任务执行日志:" + req2.LogMsg + "<br/>");
         strContent.AppendLine("任务执行结果,状态:" + req2.RunStatus.description() + ",结果:" + JsonConvert.SerializeObject(req2.TaskResult) + "<br/>");
         strContent.AppendLine("任务执行耗时(s):" + req2.TotalRunTime + "<br/>");
         AlarmHelper.AlarmAsync(task.TaskModel.isenablealarm, (AlarmType)task.TaskModel.alarmtype, alarmperson, title, strContent.ToString());
     }
 }
        /// <summary>
        /// 将任务移入任务池
        /// </summary>
        /// <param name="taskid"></param>
        /// <param name="taskruntimeinfo"></param>
        /// <returns></returns>
        public bool Add(string taskid, NodeTaskRunTimeInfo taskruntimeinfo, ref string nextrunTime)
        {
            lock (_locktag)
            {
                if (!TaskRuntimePool.ContainsKey(taskid))
                {
                    JobDetail jobDetail = new JobDetail(taskruntimeinfo.TaskModel.id.ToString(), taskruntimeinfo.TaskModel.groupid.ToString(), typeof(TaskJob));// 任务名,任务组,任务执行类
                    var       trigger   = CornFactory.CreateTigger(taskruntimeinfo);
                    _sched.ScheduleJob(jobDetail, trigger);
                    nextrunTime = Convert.ToDateTime(trigger.GetNextFireTimeUtc()).ToLocalTime().ToString("yyyy-MM-dd HH:mm:ss");
                    nextrunTime = nextrunTime.IndexOf("0001-01") > -1 ? "2099-12-30" : nextrunTime;

                    TaskRuntimePool.Add(taskid, taskruntimeinfo);
                    return(true);
                }
                return(false);
            }
        }
예제 #5
0
        public static RunTaskResult TryRunTask(this AbstractTask task, string nextRunTime, NodeTaskRunTimeInfo taskruntimeinfo)
        {
            RunTaskResult result = new RunTaskResult()
            {
                RunStatus = (int)RunStatus.Failed
            };
            string logId = "";
            long   times = 0;

            Model.enums.ExecuteStatus executestatus = Model.enums.ExecuteStatus.ExecuteSucess;
            try
            {
                task.ShowProcessIngLog("----------------------" + DateTime.Now + ":开始执行任务-----------------------------------------");
                DateTime startTime = DateTime.Now;
                //开始执行任务,上报开始执行日志,并更新任务版本状态为执行中
                #region 开始执行任务,上报开始执行日志,并更新任务版本状态为执行中
                AddTaskExecuteLogRequest req = new AddTaskExecuteLogRequest()
                {
                    NodeId        = GlobalNodeConfig.NodeID,
                    RunStatus     = Model.enums.ExecuteStatus.Executing,
                    Source        = Model.Source.Node,
                    StartTime     = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    TaskId        = taskruntimeinfo.TaskModel.id,
                    TaskParams    = taskruntimeinfo.TaskVersionModel.taskparams,
                    TaskVersionId = taskruntimeinfo.TaskVersionModel.id,
                    NextRunTime   = nextRunTime
                };
                var r2 = NodeProxy.PostToServer <AddTaskExecuteLogResponse, AddTaskExecuteLogRequest>(ProxyUrl.AddTaskVersionExecuteLog_Url, req);
                if (r2.Status != ResponesStatus.Success)
                {
                    task.ShowProcessIngLog("上报任务(taskid=" + task.TaskDetail.id + "taskversionid=" + task.TaskVersionDetail.id + ")的执行日志失败,请求地址:" + ProxyUrl.AddTaskVersionExecuteLog_Url + ",请求参数:" + JsonConvert.SerializeObject(req) + ",服务器返回参数:" + JsonConvert.SerializeObject(r2));
                }
                logId = r2.Data.LogId;
                #endregion

                Stopwatch sw = new Stopwatch();
                sw.Start();
                try
                {
                    result = task.RunTask();
                }
                catch (Exception ex)
                {
                    result = new RunTaskResult()
                    {
                        RunStatus = (int)RunStatus.Exception, Message = ex.Message, Ex = ex
                    };
                    task.ShowProcessIngLog("执行任务异常,异常信息:" + JsonConvert.SerializeObject(ex));
                }
                sw.Stop();

                TimeSpan ts = sw.Elapsed;
                times = sw.ElapsedMilliseconds / 1000;//秒

                executestatus = result.RunStatus == (int)RunStatus.Normal? Model.enums.ExecuteStatus.ExecuteSucess:(result.RunStatus == (int)RunStatus.Failed?ExecuteStatus.ExecuteFailed:ExecuteStatus.ExecuteException);
            }
            catch (Exception exp)
            {
                executestatus = Model.enums.ExecuteStatus.ExecuteException;
                task.ShowProcessIngLog("执行任务异常,异常信息:" + JsonConvert.SerializeObject(exp));
            }
            finally
            {
                #region 执行任务完毕,上报开始执行日志,并更新任务版本状态为执行中
                task.ShowProcessIngLog("上报任务状态:" + executestatus);
                task.ShowProcessIngLog("----------------------" + DateTime.Now + ":执行任务完成-----------------------------------------");

                DateTime endTime = DateTime.Now;
                //上报任务执行日志和执行结果,并更新最后一次任务状态
                UpdateTaskExecuteLogRequest req2 = new UpdateTaskExecuteLogRequest()
                {
                    NodeId        = GlobalNodeConfig.NodeID,
                    RunStatus     = executestatus,
                    Source        = Model.Source.Node,
                    EndTime       = endTime.ToString("yyyy-MM-dd HH:mm:ss"),
                    TaskId        = taskruntimeinfo.TaskModel.id,
                    TaskResult    = result,
                    LogId         = string.IsNullOrEmpty(logId)?0: int.Parse(logId),
                    TotalRunTime  = times.ToString(),
                    TaskVersionId = taskruntimeinfo.TaskVersionModel.id,
                    LogMsg        = task.GetLog(),
                };
                if (!string.IsNullOrEmpty(logId))
                {
                    var r3 = NodeProxy.PostToServer <EmptyResponse, UpdateTaskExecuteLogRequest>(ProxyUrl.UpdateTaskVersionExecuteLog_Url, req2);
                    if (r3.Status != ResponesStatus.Success)
                    {
                        task.ShowProcessIngLog("上报任务(taskid=" + taskruntimeinfo.TaskModel.id + "taskversionid=" + taskruntimeinfo.TaskVersionModel.id + ")的执行日志失败,请求地址:" + ProxyUrl.AddTaskVersionExecuteLog_Url + ",请求参数:" + JsonConvert.SerializeObject(req2) + ",服务器返回参数:" + JsonConvert.SerializeObject(r3));
                    }
                }
                log.Info(task.GetLog().ToString());
                Alaram(req2, taskruntimeinfo, task);
                task.ClearLog();
                #endregion
            }
            return(result);
        }