public static Trigger CreateTigger(NodeTaskRunTimeInfo taskruntimeinfo) { if (taskruntimeinfo.TaskVersionModel.taskcron.Contains("[")) { var customcorn = CustomCornFactory.GetCustomCorn(taskruntimeinfo.TaskVersionModel.taskcron); customcorn.Parse(); if (customcorn is SimpleCorn || customcorn is RunOnceCorn) { var simplecorn = customcorn as SimpleCorn; // 定义调度触发规则,比如每1秒运行一次,共运行8次 SimpleTrigger simpleTrigger = new SimpleTrigger(taskruntimeinfo.TaskModel.id.ToString(), taskruntimeinfo.TaskModel.groupid.ToString()); if (simplecorn.ConInfo.StartTime != null) { simpleTrigger.StartTimeUtc = simplecorn.ConInfo.StartTime.Value.ToUniversalTime(); } //else // simpleTrigger.StartTimeUtc = DateTime.Now.ToUniversalTime(); if (simplecorn.ConInfo.EndTime != null) { simpleTrigger.EndTimeUtc = simplecorn.ConInfo.EndTime.Value.ToUniversalTime(); } if (simplecorn.ConInfo.RepeatInterval != null) { simpleTrigger.RepeatInterval = TimeSpan.FromSeconds(simplecorn.ConInfo.RepeatInterval.Value); } else { simpleTrigger.RepeatInterval = TimeSpan.FromSeconds(1); } if (simplecorn.ConInfo.RepeatCount != null) { simpleTrigger.RepeatCount = simplecorn.ConInfo.RepeatCount.Value - 1;//因为任务默认执行一次,所以减一次 } else { simpleTrigger.RepeatCount = int.MaxValue;//不填,则默认最大执行次数 } return(simpleTrigger); } return(null); } else { CronTrigger trigger = new CronTrigger(taskruntimeinfo.TaskModel.id.ToString(), taskruntimeinfo.TaskModel.groupid.ToString()); // 触发器名,触发器组 trigger.CronExpressionString = taskruntimeinfo.TaskVersionModel.taskcron; // 触发器时间设定 return(trigger); } }
/// <summary> /// 执行 /// </summary> public override RunCommandResult Execute() { string taskid = CommandQueue.taskid.ToString(); string taskversionid = CommandQueue.taskversionid.ToString(); try { var taskruntimeinfo = TaskPoolManager.CreateInstance().Get(taskid.ToString()); if (taskruntimeinfo != null) { ShowCommandLog("任务已在运行中"); UploadStatus(taskid, taskversionid, TaskScheduleStatus.Scheduling, ""); return(new RunCommandResult() { ExecuteStatus = ExecuteStatus.ExecuteFailed, Message = "任务已在运行中" }); } taskruntimeinfo = new NodeTaskRunTimeInfo(); taskruntimeinfo.TaskLock = new TaskLock(); //读取任务版本信息 var taskversionreq = new LoadTaskVersionRequest() { TaskId = CommandQueue.taskid, TaskVersionId = CommandQueue.taskversionid, Source = Source.Node }; var r = NodeProxy.PostToServer <LoadTaskVersionResponse, LoadTaskVersionRequest>(ProxyUrl.TaskVersionDetail_Url, taskversionreq); if (r.Status != ResponesStatus.Success) { ShowCommandLog("获取任务版本号详情失败,请求Url:" + ProxyUrl.TaskVersionDetail_Url + ",请求参数:" + JsonConvert.SerializeObject(taskversionreq) + ",返回参数:" + JsonConvert.SerializeObject(r)); return(new RunCommandResult() { ExecuteStatus = ExecuteStatus.ExecuteFailed, Message = "获取任务版本号详情失败" }); } taskruntimeinfo.TaskVersionModel = r.Data.TaskVersionDetail; taskruntimeinfo.TaskModel = r.Data.TaskDetail; ShowCommandLog("开始创建缓存目录,域安装目录,拷贝共享程序集..."); string filelocalcachepath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskDllCompressFileCacheDir + @"\" + taskid + @"\" + r.Data.TaskVersionDetail.version + @"\" + r.Data.TaskVersionDetail.zipfilename; string domaininstallpath = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskDllDir + "\\" + taskid + "\\"; // string domaininstallmainclassdllpath = domaininstallpath + @"\" + taskruntimeinfo.TaskModel.taskclassname; string taskshareddlldir = AppDomain.CurrentDomain.BaseDirectory.TrimEnd('\\') + "\\" + GlobalNodeConfig.TaskSharedDllsDir; //通知节点TaskProvider任务执行 IOHelper.CreateDirectory(filelocalcachepath); IOHelper.CreateDirectory(domaininstallpath); File.WriteAllBytes(filelocalcachepath, taskruntimeinfo.TaskVersionModel.zipfile); CompressHelper.UnCompress(filelocalcachepath, domaininstallpath); IOHelper.CopyDirectory(taskshareddlldir, domaininstallpath);//拷贝共享程序集到域安装路径 ShowCommandLog("目录操作完成,拷贝共享程序集完成,开始创建任务的AppDomain域"); try { var dllpath = Path.Combine(domaininstallpath, taskruntimeinfo.TaskVersionModel.zipfilename + ".dll"); AbstractTask dllTask = new AppDomainLoaderHelper <AbstractTask>().CreateDomain(dllpath.Replace(".rar", "").Replace("zip", ""), taskruntimeinfo.TaskModel.taskclassname, out taskruntimeinfo.Domain); dllTask.SetAlarmList(r.Data.AlarmEmailList, r.Data.AlarmMobileList);//设置任务报警信息 tb_task cloneTaskModel = taskruntimeinfo.TaskModel.CloneObj <tb_task>(); tb_taskversion cloneTaskVersionModel = taskruntimeinfo.TaskVersionModel.CloneObj <tb_taskversion>(); dllTask.TaskDetail = cloneTaskModel; dllTask.TaskVersionDetail = cloneTaskVersionModel; dllTask.AppConfig = new TaskAppConfigInfo(); //CommandParams cmdparams= JsonConvert.DeserializeObject<CommandParams>(CommandQueue.commandparams); //if (!string.IsNullOrEmpty(cmdparams.TaskParams)) //{ // dllTask.AppConfig = JsonConvert.DeserializeObject<TaskAppConfigInfo>(cmdparams.TaskParams); //} //else //{ if (!string.IsNullOrEmpty(taskruntimeinfo.TaskVersionModel.taskparams)) { dllTask.AppConfig = JsonConvert.DeserializeObject <TaskAppConfigInfo>(taskruntimeinfo.TaskVersionModel.taskparams); } //} taskruntimeinfo.DllTask = dllTask; string nextruntime = "2099-12-30"; TaskPoolManager.CreateInstance().Add(taskid.ToString(), taskruntimeinfo, ref nextruntime); ShowCommandLog("加载AppDomain域成功,开始添加到任务池等待执行"); //上报任务执行日志,并更新调度状态为调度中 UploadStatus(taskid, taskversionid, TaskScheduleStatus.Scheduling, nextruntime); ShowCommandLog("添加到任务池成功,开启任务成功"); return(new RunCommandResult() { ExecuteStatus = ExecuteStatus.ExecuteSucess }); } catch (Exception ex) { ShowCommandLog("加载任务应用程序域异常,异常信息:" + JsonConvert.SerializeObject(ex)); UploadStatus(taskid, taskversionid, TaskScheduleStatus.StopSchedule); return(new RunCommandResult() { ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex }); } } catch (Exception ex) { ShowCommandLog("开启任务命令异常,异常信息:" + JsonConvert.SerializeObject(ex)); UploadStatus(taskid, taskversionid, TaskScheduleStatus.StopSchedule); return(new RunCommandResult() { ExecuteStatus = ExecuteStatus.ExecuteException, Message = ex.Message, Ex = ex }); } }