using IMCS.CCS.Common; using IMCS.CCS.Entitys; using IMCS.CCS.Service.Jobs; using Quartz; using Quartz.Impl.Matchers; using Quartz.Impl.Triggers; using System; using System.Linq; using System.Threading.Tasks; namespace IMCS.CCS.Service.Impl { /// /// 任务调度服务 /// public class QuartzJobService : IQuartzJobService { private readonly ISchedulerFactory _schedulerFactory; private readonly ResultfulApiJobFactory _resultfulApiJobFactory; public QuartzJobService(ISchedulerFactory schedulerFactory, ResultfulApiJobFactory resultfulApiJobFactory) { _schedulerFactory = schedulerFactory; _resultfulApiJobFactory = resultfulApiJobFactory; } /// /// 开始运行一个调度器 /// /// /// public async Task RunAsync(Tasks tasks) { //1、通过调度工厂获得调度器 var scheduler = await _schedulerFactory.GetScheduler(); var taskName = $"{tasks.ProjectId}>{tasks.ProjectName}>{tasks.Name}"; //2、创建一个触发器 var trigger = TriggerBuilder.Create() .WithIdentity(taskName, tasks.GroupName) .StartNow() .WithDescription(tasks.Remark) // 触发表达式 0 0 0 1 1 ? .WithCronSchedule(tasks.Cron) .Build(); //3、创建任务 var jobDetail = JobBuilder.Create() .WithIdentity(taskName, tasks.GroupName) .UsingJobData("TasksId", tasks.Id.ToString()) .Build(); //4、写入 Job 实例工厂 解决 Job 中取 ioc 对象 scheduler.JobFactory = _resultfulApiJobFactory; //5、将触发器和任务器绑定到调度器中 await scheduler.ScheduleJob(jobDetail, trigger); //6、开启调度器 await scheduler.Start(); return await Task.FromResult(true); } /// /// 关闭调度器 /// /// /// public async Task CloseAsync(Tasks tasks) { IScheduler scheduler = await _schedulerFactory.GetScheduler(); var jobKeys = (await scheduler .GetJobKeys(GroupMatcher.GroupEquals(tasks.GroupName))) .ToList(); var taskName = $"{tasks.ProjectId}>{tasks.ProjectName}>{tasks.Name}"; if (jobKeys == null || jobKeys.Count() == 0) { throw new MessageBox($"未找到分组:{tasks.GroupName}"); } JobKey jobKey = jobKeys .FirstOrDefault(w => scheduler.GetTriggersOfJob(w).Result.Any(x => (x as CronTriggerImpl).Name == taskName)); if (jobKey == null) { throw new MessageBox($"未找到触发器:{taskName}"); } // var triggers = await scheduler.GetTriggersOfJob(jobKey); ITrigger trigger = triggers?.Where(x => (x as CronTriggerImpl).Name == taskName).FirstOrDefault(); if (trigger == null) { throw new MessageBox($"未找到触发器:{taskName}"); } // await scheduler.PauseTrigger(trigger.Key); await scheduler.UnscheduleJob(trigger.Key);// 移除触发器 await scheduler.DeleteJob(trigger.JobKey); return await Task.FromResult(true); } } }