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