public JsonResult EditTask(QuartzTaskEditModel model) { if (!ModelState.IsValid) { return(Json(new MessageData(false, "参数错误!"))); } if (model.Id == 0 && _quartzTaskService.QuartzTasks.Any(n => n.ClassType == model.ClassType)) { return(Json(new MessageData(false, "任务已存在!"))); } try { QuartzTask task = model.AsQuartzTask(); if (model.Id > 0) { _quartzTaskService.Update(task); DIContainer.Resolve <ITaskScheduler>().SaveTaskStatus(task); } else { _quartzTaskService.Create(task); DIContainer.Resolve <ITaskScheduler>().ResumeAll(); } } catch (Exception ex) { _logger.Error(ex); return(Json(new MessageData(false, "提交失败!"))); } return(Json(new MessageData(true, "提交成功!"))); }
/// <summary> /// 转换成QuartzTaskEditModel /// </summary> /// <returns></returns> public static QuartzTaskEditModel AsEditModel(this QuartzTask quartzTask) { string seconds = quartzTask.GetRulePart(RulePart.seconds); string minutes = quartzTask.GetRulePart(RulePart.minutes); string hours = quartzTask.GetRulePart(RulePart.hours); string day = quartzTask.GetRulePart(RulePart.day); string mouth = quartzTask.GetRulePart(RulePart.mouth); string dayOfWeek = quartzTask.GetRulePart(RulePart.dayofweek) ?? string.Empty; string[] rulePartArray = quartzTask.TaskRule.Split(' '); TaskFrequency frequency = TaskFrequency.EveryDay; if ((rulePartArray[3].Contains("/") || rulePartArray[3] == "*") && rulePartArray[4] == "*") { frequency = TaskFrequency.EveryDay; } else if (rulePartArray[5] != "?" && !rulePartArray[5].Contains("#")) { frequency = TaskFrequency.Weekly; } else { frequency = TaskFrequency.PerMonth; } bool dayRepeat = false; for (int i = 0; i < 3; i++) { dayRepeat = rulePartArray[i].Contains("*") || rulePartArray[i].Contains("/"); if (dayRepeat) { break; } } return(new QuartzTaskEditModel() { TaskName = quartzTask.Name, IsRepeat = quartzTask.TaskRule.Contains("/") || quartzTask.TaskRule.Contains("*"), Seconds = seconds, Minutes = minutes, Hours = hours, Day = day, Mouth = mouth, Frequency = frequency, DayOrWeekly = !dayOfWeek.Contains("#"), DayOfMouth = day, WeeklyOfMouth = dayOfWeek.Contains("#") ? dayOfWeek.Substring(0, dayOfWeek.IndexOf("#")) : "2", Number = dayOfWeek.Contains("#") ? dayOfWeek.Substring(dayOfWeek.IndexOf("#") + 1) : "1", DayOfWeek = dayOfWeek.Contains("#") ? null : dayOfWeek.Split(','), DayRepeat = dayRepeat, OnceTime = !dayRepeat ? new DateTime(2016, 1, 1, Convert.ToInt32(hours), Convert.ToInt32(minutes), Convert.ToInt32(seconds)) : new DateTime(2016, 1, 1, 1, 0, 0), OnceDate = !dayRepeat ? new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(hours), Convert.ToInt32(minutes), Convert.ToInt32(seconds)) : DateTime.Now, StartDate = string.IsNullOrEmpty(quartzTask.StartDate.ToString()) ? DateTime.Now : quartzTask.StartDate, EndDate = quartzTask.EndDate ?? new DateTime(2099, DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second), Enabled = quartzTask.Enabled }); }
public ActionResult EditTask(int?id = null) { QuartzTask quartzTask = null; if (id.HasValue) { quartzTask = _quartzTaskService.FindById(id.Value); } else { quartzTask = new QuartzTask(); quartzTask.Enabled = true; quartzTask.StartDate = DateTime.Now; quartzTask.TaskRule = "* * * * * ?"; } if (quartzTask == null) { return(HttpNotFound()); } var classTypes = DIContainer.Resolve <ITypeFinder>().FindClassesOfType <ITask>(); ViewData["classType"] = classTypes.Select(n => new SelectListItem { Text = n.Name, Value = n.FullName, Selected = n.FullName == quartzTask.ClassType }); QuartzTaskEditModel editModel = quartzTask.AsEditModel(); InitRules(editModel); return(View(editModel)); }
/// <summary> /// 运行单个任务 /// </summary> /// <param name="Id">任务Id</param> public void Run(int Id) { QuartzTask task = GetTask(Id); Run(task); SaveTaskStatus(task); }
/// <summary> /// 转换为TaskDetailEditModel用于数据库存储 /// </summary> public QuartzTask AsQuartzTask() { QuartzTask quartzTask = DIContainer.Resolve <IQuartzTaskService>().FindById(Id); if (quartzTask == null) { quartzTask = new QuartzTask(); } quartzTask.Name = TaskName; quartzTask.ClassType = ClassType; quartzTask.TaskRule = GenerateRule(); quartzTask.StartDate = StartDate; quartzTask.EndDate = EndDate; quartzTask.Enabled = Enabled; return(quartzTask); }
/// <summary> /// 运行单个任务 /// </summary> /// <param name="task">要运行的任务</param> public void Run(QuartzTask task) { if (task == null) { return; } Type type = Type.GetType(task.ClassType); if (type == null) { return; } //任务重复运行检测 if (task.IsRunning) { return; } ITask t = (ITask)Activator.CreateInstance(type); if (t != null) { task.IsRunning = true; DateTime lastStart = DateTime.Now; try { t.Execute(); task.LastIsSuccess = true; task.LastFailMessage = null; } catch (Exception ex) { task.LastIsSuccess = false; task.LastFailMessage = ex.Message; } task.IsRunning = false; task.LastStart = lastStart; task.LastEnd = DateTime.Now; SaveTaskStatus(task); } }
public void Execute(IJobExecutionContext context) { int Id = context.JobDetail.JobDataMap.GetInt("Id"); QuartzTask task = TaskSchedulerFactory.GetScheduler().GetTask(Id); if (task == null) { throw new ArgumentException("Not found task :" + task.Name); } IQuartzTaskService quartzTaskService = DIContainer.Resolve <IQuartzTaskService>(); task.IsRunning = true; DateTime lastStart = DateTime.Now; try { ITask excuteTask = (ITask)Activator.CreateInstance(Type.GetType(task.ClassType)); excuteTask.Execute(task); task.LastIsSuccess = true; } catch (Exception) { task.LastIsSuccess = false; } task.IsRunning = false; task.LastStart = lastStart; if (context.NextFireTimeUtc.HasValue) { task.NextStart = context.NextFireTimeUtc.Value.LocalDateTime; } else { task.NextStart = null; } task.LastEnd = DateTime.Now; DIContainer.Resolve <ITaskScheduler>().SaveTaskStatus(task); }
/// <summary> /// 更新任务状态 /// </summary> /// <param name="task"></param> public void SaveTaskStatus(QuartzTask task) { if (task == null) { return; } var taskService = DIContainer.Resolve <IQuartzTaskService>(); var t = taskService.FindById(task.Id); if (t != null) { t.LastStart = task.LastStart; t.LastEnd = task.LastEnd; t.NextStart = task.NextStart; t.IsRunning = task.IsRunning; t.LastIsSuccess = task.LastIsSuccess; t.LastFailMessage = task.LastFailMessage; taskService.Update(t); } }
/// <summary> /// 更新任务 /// </summary> /// <param name="task"></param> public void Update(QuartzTask task) { if (task == null) { return; } int index = _tasks.FindIndex(n => n.Id == task.Id); if (_tasks[index] == null) { return; } task.ClassType = _tasks[index].ClassType; task.LastEnd = _tasks[index].LastEnd; task.LastStart = _tasks[index].LastStart; task.LastIsSuccess = _tasks[index].LastIsSuccess; _tasks[index] = task; Type type = Type.GetType(task.ClassType); if (type == null) { return; } Remove(type.Name); if (!task.Enabled) { return; } string triggerName = type.Name + "_trigger"; IJobDetail job = JobBuilder.Create(typeof(JobDetail)) .WithIdentity(type.Name) .Build(); job.JobDataMap.Add(new KeyValuePair <string, object>("Id", task.Id)); TriggerBuilder tb = TriggerBuilder.Create() .WithIdentity(triggerName) .WithCronSchedule(task.TaskRule); if (task.NextStart.HasValue) { tb.StartAt(new DateTimeOffset(task.NextStart.Value)); } else if (task.StartDate > DateTime.MinValue) { tb.StartAt(new DateTimeOffset(task.StartDate)); } if (task.EndDate.HasValue && task.EndDate > task.StartDate) { tb.EndAt(task.EndDate); } ICronTrigger trigger = (ICronTrigger)tb.Build(); DateTime nextStart = sched.ScheduleJob(job, trigger).LocalDateTime; if (task.NextStart.HasValue && task.NextStart < nextStart) { task.NextStart = nextStart; } }
/// <summary> /// 删除任务 /// </summary> /// <param name="task"></param> public void Delete(QuartzTask task) { _quartzTaskRepository.Delete(task); }
/// <summary> /// 更新任务 /// </summary> /// <param name="task"></param> public void Update(QuartzTask task) { _quartzTaskRepository.Update(task); }
/// <summary> /// 创建任务 /// </summary> /// <param name="task"></param> public void Create(QuartzTask task) { _quartzTaskRepository.Insert(task); }