public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException) { var taskId = Guid.Empty; if (Guid.TryParse(Name, out taskId)) { using (TaskDbContext db = new TaskDbContext()) { var task = db.Task.FirstOrDefault(m => m.Id == taskId && m.Status > (int)TaskStatus.Deleted); if (task == null) { return; } var stop = false; if (jobException == null) { var utcDate = context.Trigger.GetNextFireTimeUtc(); var nextRunTime = utcDate.HasValue ? TimeZoneInfo.ConvertTimeFromUtc(utcDate.Value.DateTime, TimeZoneInfo.Local) : new DateTime?(); task.LastRunTime = DateTime.Now; task.TotalRunCount = task.TotalRunCount + 1; if (task.RunMoreTimes) { task.NextRunTime = nextRunTime; task.Status = (int)TaskStatus.Running; } else { stop = true; } } else { //对只执行 一次并且本次抢锁失败的任务,在这里停止掉 if (jobException.Message == "lockfailed" && !task.RunMoreTimes) { stop = true; } } if (stop) { QuartzManager.Stop(taskId); task.Status = (int)TaskStatus.Stop; task.NextRunTime = null; } db.SaveChanges(); } } }
public Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken) { IJobDetail job = context.JobDetail; var instance = job.JobDataMap["instance"] as IHosSchedule; if (jobException == null) { var utcDate = context.Trigger.GetNextFireTimeUtc(); DateTime?nextTime = utcDate.HasValue ? TimeZoneInfo.ConvertTimeFromUtc(utcDate.Value.DateTime, TimeZoneInfo.Local) : new DateTime?(); OnSuccess(Guid.Parse(job.Key.Name), nextTime); //子任务触发 Task.Run(async() => { foreach (var item in instance.Children) { var jobkey = new JobKey(item.Key.ToString()); if (await context.Scheduler.CheckExists(jobkey)) { JobDataMap map = new JobDataMap { new KeyValuePair <string, object>("PreviousResult", context.Result) }; await context.Scheduler.TriggerJob(jobkey, map); } } }); } else if (jobException is BusinessRunException) { Task.Run(() => { if (instance.Keepers != null && instance.Keepers.Any()) { MailKitHelper.SendMail( instance.Keepers, $"任务运行异常 — {instance.Main.Title}", QuartzManager.GetErrorEmailContent(instance.Main.Title, (jobException as BusinessRunException).Detail) ); } }); } return(Task.FromResult(0)); }