Ejemplo n.º 1
0
        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();
                }
            }
        }
Ejemplo n.º 2
0
        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));
        }