目录
Trigger、Job、Schedule Listiners
ADO.NET Job Store(AdoJobStore)
Trigger
属性
所有Trigger都实现ITrigger,看下ITrigger就能知道Trigger的基本属性
TriggerKey 最开始的示例代码有,是Trigger的Identity
JobDataMap 上面提到过
JobKey 关联对应JobKey的Job
StartTimeUtc Trigger如果多次触发,那么从这一天开始(例如设置了2020年6月30号,那么2020年6月30号之前是不会触发的)
EndTimeUtc 同上,从这一天结束,不再触发Trigger
Priority 默认是5,多个Trigger同时触发,竞争线程的时候,Priority越大执行优先度越高
MisFire Instructions 当多个trigger同时触发,有的trigger不能及时触发,会出现misfire instructions 不同的trigger type对应不同的misfire 之后再讲
Calendars 实现了ICalendar接口的类对象,可以用来排除特定日期(比如Trigger设置的每天执行,但是用来排除特定的节假日!)
使用scheduler的AddCalendar方法来初始化Calendar,(官方提供HolidayCalendar来排除节假日,TODO)
quartz.impl.calendar明明空间提供了一系列的ICalendar实现类,可能会满足需求(TODO)
SimpleTrigger
正如命名所示,较为简单的场景可以使用SimpleTrigger就可以了(单次执行的任务 和 按照简单规则多次执行的任务)
需要使用WithSimpleSchedule方法
可以看到源代码中定义如下:
public static TriggerBuilder WithSimpleSchedule(this TriggerBuilder triggerBuilder, Action<SimpleScheduleBuilder> action);
WithSimpleSchedule是TriggerBuilder的一个扩展方法,需要一个Action参数
示例:
class Program
{
public static async Task Main(string[] args)
{
Console.WriteLine(DateTime.Now.ToString("HH:mm:ss"));
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
IScheduler scheduler=await schedulerFactory.GetScheduler();
await scheduler.Start();
IJobDetail job = JobBuilder.Create<TestJob>()
.WithIdentity("testJob", "testGroup")
.Build();
//每5秒执行1次(WithInternvalInSeconds)
//重复2次(一共执行3次,如果WithRepeatCount是0,那么只会执行1次!)
//从现在开始10秒后触发(StartAt)
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("testTrigger", "testGroup")
.WithSimpleSchedule(x=>x.WithIntervalInSeconds(5).WithRepeatCount(2))
.StartAt(DateTime.Now.AddSeconds(10))
.Build();
await scheduler.ScheduleJob(job, trigger);
Console.ReadLine();
}
}
public class TestJob : IJob
{
public async Task Execute(IJobExecutionContext context)
{
await Console.Out.WriteLineAsync("executeJob:"+ DateTime.Now.ToString("HH:mm:ss"));//每5秒打印一次 一共打印了3次 第一次距main方法10秒
}
}
上面的WithRepeatCount 方法指定了重复的次数,使用RepeatForever方法可以永远执行下去
在WithSimpleSchedule方法中可以手动指定MisfirePolicy,所有的trigger默认都使用smart policy,也可以手动指定
x=>x.WithMisfireXXXXX 这样的形式来指定
DateBuilder是quartz提供的一个时间工具类,可以很方便的构建一个日期,配合StartAt方法使用!
CronTrigger
可以使用cron表达式的复杂Trigger
所有的触发情况基本都可以使用CronTrigger来满足需求(需要反复执行的任务)
在线Cron表达式生成地址:https://qqe2.com/cron
一个简单的cron表达式示例:
0 30 23 * * ?
代表每天晚上23:30:00会出发一次trigger
Cron表达式包含7个部分,每个部分用空格隔开:
- 秒
- 分
- 小时
- 日(每月第几天)
- 月份
- 周(每周第几天)
- 年份(可以省略)
cron表达式这里就不再展开了,反正可以直接在线生成~~~
创建CronTrigger的方法:
使用TriggerBuilder的Build方法,创建过程中使用WithCronSchedule方法
也可以直接使用WithSchedule方法使用CronScheduleBuilder
WithCronSchedule示例:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("testTrigger", "testGroup")
.WithCronSchedule("0/5 * * * * ? ")
.StartAt(DateTime.Now.AddSeconds(5))
.Build();//从每分钟的0秒开始 每5秒执行一次 (开始时间是startat指定时间)
CronScheduleBuilder示例:
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("testTrigger", "testGroup")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(23,30))
.Build();//每天23:30执行一次
注意有一个InTimeZone方法,可以让出发时间不按照系统时间来计算,而是按照指定的TimeZone来
Misfire属性用法和SimpleTrigger差不多,也是在WithCronSchedule中指定,这里先不详细说。
Trigger、Job、Schedule Listiners
自定义监听器基本用不到。
可以自定义Tigger和Job的监听器,分别实现ITriggerListener和IJobListener接口就可以了,
也可也选择继承TriggerListenerSupport和JobListenterSupport类,然后只override需要修改的event就可以了。
可以监听Trigger的Fire、Misfire、Complete(job完成了)
和Job的 将要执行前(to be executed) 、完成执行(completed execution)
自定义监听器在scheduler的ListennerManager上注册(运行时注册),必须要指定Name属性!
scheduler.ListenerManager.AddJobListner(.......);
注意:自定义的监听器,不允许抛出异常,所有异常需要在内部用try catch解决,否则会导致程序失败!
ISchedulerListener是自定义scheduler监听器要实现的接口,也使用scheduler的ListenerManager注册(AddSchedulerListener方法)
监听scheduler的 添加job/trigger、移除job/trigger、shutdown通知、内部报错等等
JobStore
jobstore是用来存储scheduler相关的 数据(jobs、triggers、calendars等等)
注意不要在业务代码中使用JobStore,一开始配置好就行了(配置SchedulerFactory),大部分情况不要去配置
RAMJobStore
Quartz框架默认使用RAMJobStore,正如命名一样,它保证数据都存储在内存中。
一把情况当你使用StdSchedulerFactory的时候,不需要指定使用RAMJobStore(quartz.jobStore.Type=Quartz.Simpl.RAMJobStore)
当然存在内存中,重启就没了。
ADO.NET Job Store(AdoJobStore)
如名称所述,将状态数据存数据库里面,因为这样访问硬盘了所以速度远比ram慢,要设置Ado
先要在数据库里面跑一下官方提供的脚步来创建相应的数据库表(官方项目的database/dbtables文件夹下,所有表QRTZ_开头)
JobStoreTX是这时候要使用的adojobstore实现类。配置方法如下:
quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
DriverDelegate负责完成与数据库交互(ADO.NET)相关的工作,配置方法如下:(STDAdoDelegate是系统提供的实现)
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz
配置数据库前缀(默认是QRTZ_, 你也可以自己修改数据库)
quartz.jobStore.tablePrefix = QRTZ_
配置Data Source
quartz.jobStore.dataSource = myDS
配置数据库连接示例:(sqlserver mysql oracle都支持)
quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartz;Uid=quartznet;Pwd=quartznet
quartz.dataSource.myDS.provider = MySql
官方建议将userProperties属性设置为true,JobDataMap里面的参数全部都要是字符串
quartz.jobStore.useProperties = true