任务调度系统Quartz.net详解2-Scheduler、Calendar及Listener
Scheduler
调度器scheduler是Quartz中的独立工作容器,所有的Trigger和Job都需要注册到scheduler中才能工作。我们可以通过SchedulerFactory来获取scheduler实例。如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result;
NameValueCollection properties = new NameValueCollection { ["quartz.scheduler.instanceName"] = "MyScheduler", ["quartz.threadPool.threadCount"] = "20", ["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool, Quartz", ["quartz.jobStore.type"] = "Quartz.Simpl.RAMJobStore, Quartz" }; ISchedulerFactory factroy = new StdSchedulerFactory(properties); IScheduler scheduler= await factroy .GetScheduler();
|
scheduler常用的方法
1 2 3 4 5 6 7 8 9 10 11 12
| scheduler.Start(); scheduler.PauseJob(JobKey.Create("jobname", "groupname")); scheduler.ResumeJob(JobKey.Create("jobname", "groupname")); scheduler.DeleteJob(JobKey.Create("jobname", "groupname")); scheduler.PauseTrigger(new TriggerKey("triggername", "groupname")); scheduler.ResumeTrigger(new TriggerKey("triggername", "groupname")); scheduler.UnscheduleJob(new TriggerKey("triggername", "groupname")); scheduler.GetTriggersOfJob(JobKey.Create("jobname", "groupname")); scheduler.Standby(); scheduler.Shutdown(); scheduler.GetMetaData(); scheduler.Clear();
|
多任务调度
1 2 3 4 5
| Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>> triggersAndJobs = new Dictionary<IJobDetail, IReadOnlyCollection<ITrigger>>(); triggersAndJobs.Add(job1, new List<ITrigger>() { trigger1,trigger2}); triggersAndJobs.Add(job2, new List<ITrigger>() { trigger3}); await scheduler.ScheduleJobs(triggersAndJobs, true);
|
Calendar
Calendar主要作用就是为了排除Trigger中一些特定的时间节点.
使用Calendar的流程是:首先获取一个Calendar实例,然后将Calendar注册到scheduler容器中,在将Calendar绑定到触发器上即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = factory.GetScheduler().Result;
IJobDetail Job1 = JobBuilder.Create<MyJob>().Build();
DailyCalendar calendar = new DailyCalendar(DateBuilder.DateOf(19, 0, 0).DateTime, DateBuilder.DateOf(21, 0, 0).DateTime);
scheduler.AddCalendar("mycal", calendar, true, true);
ITrigger trigger1 = TriggerBuilder .Create() .StartNow() .ForJob(job2) .WithPriority(1) .WithCalendarIntervalSchedule(x => x.WithIntervalInMonths(1)) .ModifiedByCalendar("mycal") .Build();
|
Quartz.net中一共提供了六种Calendar,六种Calendar的用法大同小异,列举如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| DailyCalendar calendar = new DailyCalendar(DateBuilder.DateOf(19, 0, 0).DateTime, DateBuilder.DateOf(23, 0, 0).DateTime);
WeeklyCalendar calendar = new WeeklyCalendar(); calendar.SetDayExcluded(DayOfWeek.Sunday, true);
HolidayCalendar calendar = new HolidayCalendar(); calendar.AddExcludedDate(DateTime.Parse("2018/1/2"));
MonthlyCalendar calendar = new MonthlyCalendar(); calendar.SetDayExcluded(8,true);
AnnualCalendar calendar = new AnnualCalendar(); calendar.SetDayExcluded(DateTime.Parse("2018/1/2"), true);
CronCalendar calendar = new CronCalendar("* * * 2 1 ?");
|
Listener
JobListener
用于在Job执行前、后和被拒绝时执行一些动作,和Asp.net中的filter很相似。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
public class MyJobListener : IJobListener { public string Name => "hello joblisener"; public async Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)) { await Task.Run(() => { }); } public async Task JobToBeExecuted(IJobExecutionContext context, CancellationToken cancellationToken = default(CancellationToken)) { await Task.Run(() => { Console.WriteLine("myjob-------------begin"); }); } public async Task JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException, CancellationToken cancellationToken = default(CancellationToken)) { await Task.Run(() => { Console.WriteLine("myjob---------------end"); Console.WriteLine(); }); } }
|
设置scheduler的ListenerManager
1 2 3 4 5 6 7 8
|
scheduler.Start();
scheduler.ListenerManager.AddJobListener(new MyJobListener(), GroupMatcher<JobKey>.AnyGroup());
scheduler.ScheduleJob(job, trigger).Wait();
|
同理,TriggerListener和JobListener用法类似