Quartz.NET作为一款定时框架,它的最小可运行程序如下:
var scheduler = StdSchedulerFactory.GetDefaultScheduler();
scheduler.Start();
//Job执行的任务
var job = JobBuilder.Create<MyJob>().Build();
//Schedule计划表,可以设置调用次数,调用间隔
//Trigger触发器,可以设置调用开始,结束时间,优先级
var trigger = TriggerBuilder.Create().WithSimpleSchedule(
m => m.WithIntervalInSeconds(1).WithRepeatCount(1))
.StartNow()//.EndAt(DateTimeOffset.Now.AddSeconds(10))
.Build();
scheduler.ScheduleJob(job, trigger);
它有两个核心要素:Job和Trigger,Job用于通过实现了IJob接口的泛型即PublishJob告诉框架做什么,而Trigger告诉框架何时做。
MyJob类:
/// <summary>
/// 自定义任务
/// </summary>
public class MyJob : IJob
{
public void Execute(IJobExecutionContext context)
{
//实现具体的业务逻辑
}
}
Job常用方法
UsingJobData(key, value)方法
通过这个方法可以给具体的任务实现类即上面的MyJob传值,例如: context.JobDetail.JobDataMap["count"]
WithDescription(description)方法
用于描述Job的名称,业务逻辑,我一开始还很奇怪任务的名称和业务逻辑完全可以在代码中描述,为何还要有这个方法,原来这个方法的使用场景是:自定义定时任务框架,比如开发一套类似于Windows定时任务的工具。
WithIdentity(name)
给JobKey命名,JobKey是JobBuilder的一个属性,它的底层代码如下:
public JobBuilder WithIdentity(string name)
{
//new一个JobKey,name是key的名称,group名称是null
key = new JobKey(name, null);
return this;
}
StoreDurably(durability)
是否持久化(默认当没有Trigger指向Job时,Job会被删掉)
SetJobData(newJobDataMap)
给JobDataMap设置一个新的对象,这个方法与上面的UsingJobData方法区别在于一个是给JobDataMap添加值,一个是重新给这个对象赋值,它们的底层代码如下。
SetJobData:
public JobBuilder SetJobData(JobDataMap newJobDataMap)
{
jobDataMap = newJobDataMap;
return this;
}
UsingJobData:
public JobBuilder UsingJobData(string key, string value)
{
jobDataMap.Put(key, value);
return this;
}
Trigger常用方法
StartAt(startTimeUtc) 方法
设置触发器开始执行的时间,这个参数是可以设置时区的。
Quartz.NET框架自身还封装了一个日期工具类DateBuilder,它实现类很多返回下一分钟(小时,天等)方法,它与StartAt能够很好地配合。
例如:
DateBuilder.EvenMinuteDateAfterNow(); 返回现在时刻地下一分钟,例如:现在的时间是12点29分20秒,它会返回12点30分00秒
EndAt(endTimeUtc) 方法
与StartAt对应的是EndAt方法,它用于设置触发器的关闭时间
WithSimpleSchedule(action) 方法
创建了一个简单的执行计划,可以设置执行次数,频率等,这个方法是最常用的,我们熟悉的Timer定时器就类似于这个。
它的参数是一个委托Action<SimpleScheduleBuilder>,我们就是通过调用SimpleScheduleBuilder的方法来设置执行次数&间隔时间的。
WithDailyTimeIntervalSchedule(action) 方法
创建一个功能更强的执行计划,它可以设置每天几点到几点执行,工作日执行或只在周末执行,在执行了几次后停止,在某一个星期执行,设置执行频率等。
它的参数是一个委托Action<DailyTimeIntervalScheduleBuilder>,我们就是通过调用DailyTimeIntervalScheduleBuilder的方法来设置执行策略的。
WithCronSchedule(cronExpression)方法
通过Corn表达式来设置执行计划,这种方式与上面两种的优点在于我们可以不再通过硬编码的方式来设置执行策略,而是通过字符串来控制执行策略。
语法如下:
//秒 分 时 天 月 年 周
//1. 天或者周必须有一个是?(?表示模糊)
//2. * 表示所有值即,秒位为*表示每秒执行一次
//3. - 表示范围,分钟位为10-12表示每个小时的10,11,12分执行一次
//4. , 表示每个值即,分钟位为10,20,30表示每个小时的10,20,30分执行一次
//5. / 表示递增,秒位为0/5表示0,5,10,15,20,25,30,35,40,45,50,55秒执行一次
//例子:
// * * * * * ? => 每秒执行一次
// 0/5 * * * * ? => 5s执行一次
// 0 * * * * ? => 1min执行一次
// 0 0 1 * * ? => 每个月1号执行一次
// 地址:https://www.quartz-scheduler.net/documentation/quartz-2.x/tutorial/crontrigger.html