正如标题所示,文章主要是围绕Quartz.Net作业调度框架话题展开的,内容出自博主学习官方Examples的学习心得与体会,文中难免会有错误之处,还请指出得以指教。
前面了解了一些基本触发器构造作业调度的基础例子,接下来本篇会学习到关于Cron表达式的触发器。
PS:ICronTrigger触发器所轮询的将是无限重复轮询。
一,还是先来看一下代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Common.Logging; using Quartz.Impl; using System.Threading; namespace Quartz.Examples { public class YZRExample2:IExample { #region IExample 成员 public string Name { get { return GetType().Name; } } public void Run() { ILog log = LogManager.GetLogger(typeof(CronTriggerExample)); log.Info("------- 初始化 -------------------"); ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler(); log.Info("------- 初始化 完成 --------"); log.Info("------- 添加调度作业 ----------------"); IJobDetail job = JobBuilder.Create<SimpleJob>() .WithIdentity("job1", "group1") .Build(); ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/30 * * * * ?") .Build(); DateTimeOffset ft = sched.ScheduleJob(job, trigger); log.Info(job.Key + " has been scheduled to run at: " + ft + " and repeat based on expression: " + trigger.CronExpressionString); sched.Start(); log.Info("------- 开始调度进行中 -----------------"); log.Info("------- Waiting five minutes... ------------"); try { // wait five minutes to show jobs Thread.Sleep(300 * 1000); // executing... } catch (ThreadInterruptedException) { } log.Info("------- Shutting Down ---------------------"); sched.Shutdown(true); log.Info("------- Shutdown Complete -----------------"); SchedulerMetaData metaData = sched.GetMetaData(); log.Info(string.Format("Executed {0} jobs.", metaData.NumberOfJobsExecuted)); } #endregion } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Quartz.Examples { using Common.Logging; /// <summary> /// This is just a simple job that gets fired off many times by example 2. /// </summary> /// <author>Bill Kratzer</author> /// <author>Marko Lahma (.NET)</author> public class SimpleJob : IJob { private static readonly ILog log = LogManager.GetLogger(typeof(SimpleJob)); /// <summary> /// Called by the <see cref="IScheduler" /> when a /// <see cref="ITrigger" /> fires that is associated with /// the <see cref="IJob" />. /// </summary> public virtual void Execute(IJobExecutionContext context) { //这个作业演示简单的打印出作业本身的名称以及正在运行的日期和时间 JobKey jobKey = context.JobDetail.Key;//作业的名称 String description=context.JobDetail.Description;//作业的描述 bool durable=context.JobDetail.Durable;//是否持续着 log.InfoFormat("SimpleJob says: {0} executing at {1} and Description is {2} and durable is {3}", jobKey, DateTime.Now.ToString("r"), description,durable); } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Quartz.Examples { /// <summary> /// Interface for examples. /// </summary> /// <author>Marko Lahma (.NET)</author> public interface IExample { string Name { get; } void Run(); } }
无论如何,同样的我们需要得到调度实例对象:
ISchedulerFactory sf = new StdSchedulerFactory(); IScheduler sched = sf.GetScheduler();
定义作业类:
IJobDetail job = JobBuilder.Create<SimpleJob>() .WithIdentity("job1", "group1") .Build();
使用Cron表达式创建Cron触发器:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0/30 * * * * ?") .Build();
特别要记得的是开启调度:
DateTimeOffset ft = sched.ScheduleJob(job, trigger);
sched.Start();
看回去WithCronSchedule("0/30 * * * * ?"), 第一个参数针对是秒数(以空格分隔)
==> 0/30表示:最近一次可以整除30的点开始(30s,60s),比如你是在25s开启的,那么在第30s时候就会触发,并且每30秒一次,如果你是第35秒开启的,那么 在第60s时候会触发,并且也是30秒一次循环
==> 1/30表示:在0/30的基础上加多1秒触发,比如像上面的例子,触发的时间点是(31s,01s)以此类推,分子表示多加的秒数,分母表示循环周期
==>如果是一个整数,比如15,那么就是表示每到第15s这个点的时候触发,可以指定多个整数,比如0,30,那么0s(60s),30s这两个时机会触发。
二:WithCronSchedule分钟表示
将上面tirgger稍微改动一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger2", "group1") .WithCronSchedule("15 0/1 * * * ?") .Build();
WithCronSchedule("15 0/1 * * * ?") 指每1分钟的第15s时机触发
同理,相关用法请看上面解释。
三:WithCronSchedule时钟表示
将上面tirgger稍微改动一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger3", "group1") .WithCronSchedule("0 0/2 8-17 * * ?") .Build();
WithCronSchedule("0 0/2 8-17 * * ?") 小时的表示:
==>8-17这样的时间段来指定,每天的8-17时每刚满2分钟执行一次。
==>10pm这样指定具体的小时点数,这里指定下午10点,即下午10点的这个时机触发。如果要指定一个小时内,比如想在晚上11点到12点之前执行,那么小时位可以写为23-0(不能写24)
四:WithCronSchedule日表示
将上面tirgger稍微改动一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger5", "group1") .WithCronSchedule("0,30 0/1 23-0 1,20 * ?") .Build();
同理,指的就是本月的1号和20号。
五:WithCronSchedule月表示
将上面tirgger稍微改动一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger5", "group1") .WithCronSchedule("0,30 0/1 23-0 1,20 1 ?") .Build();
六:WithCronSchedule星期表示
将上面tirgger稍微改动一下:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger6", "group1") .WithCronSchedule("0,30 * * ? * MON-FRI") .Build();
同理,星期一到星期五触发。使用逗号就是分别指周几触发,比如周末触发就可以写为:
ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create() .WithIdentity("trigger7", "group1") .WithCronSchedule("0,30 * * ? * SAT,SUN") .Build();