第四章节介绍所有Trigger的共性。之后的第五章和第六章将分别介绍最常使用的SimpleTrigger和CronTrigger。
第四章节的知识点大致分为三个部分
- 公共的属性。
- 当任务没有触发时的解决方案
- Calendar接口。
在介绍这些,首先需要了解Trigger的类结构
1、Trigger类结构
接口:
- Trigger:代表触发器,是Trigger类体系结构的顶级接口。
- CalendarIntervalTrigger:日期间隔触发器,根据日期的值,日期的单位,以及间隔的时间值,间隔时间单位,重复次数构成的触发器。
- CoreTrigger:只有一个方法, hasAddtionalProperties。所有的Trigger都实现此接口。
- CronTrigger:根据Cron表达式触发的Cron触发器。
- MutableTrigger:包含设置公共属性的setXX方法,所有的Trigger都实现此接口
- SimpleTrigger:简单触发器,只包含获取重复次数和间隔的getXX方法。
- DailyTimeIntervalTrigger:在简单触发器的基础上添加获取开始时间和结束时间的一些方法,这里的时间不包含日期。
CalendarIntervalTrigger和DailyTimeIntervalTrigger与SimpleTrigger的功能基本类似,都是根据时间的值,时间的单位,间隔时间的时间值,间隔时间单位,重复次数等构建触发器,这里的时间包含日期,所有的条件都可以根据SimpleTriggerBuilder的方法去构建。
本质上只有两种Trigger,一种是SimpleTriggerBuilder构建出来的触发器,一种是CronTriggerBuilder构建出来的触发器。
2、公共属性
Trigger的公共属性可以通过TriggerBuilder的一段源码去了解,源码如下:
@SuppressWarnings("unchecked") public T build() { if(scheduleBuilder == null) scheduleBuilder = SimpleScheduleBuilder.simpleSchedule(); MutableTrigger trig = scheduleBuilder.build(); trig.setCalendarName(calendarName); trig.setDescription(description); trig.setStartTime(startTime); trig.setEndTime(endTime); if(key == null) key = new TriggerKey(Key.createUniqueName(null), null); trig.setKey(key); if(jobKey != null) trig.setJobKey(jobKey); trig.setPriority(priority); if(!jobDataMap.isEmpty()) trig.setJobDataMap(jobDataMap); return (T) trig; }
- CalendarName:Calendar对象的唯一标识,在触发器上排除一些时间。
- Description:触发器的一段描述文字,非必须属性
- startTime:触发器的开始时间,当根据日期,间隔,重复次数构建触发器时,它表示任务的开始时间点,例如计算每隔40秒执行3次,会根据开始时间点计算任务第一次执行的时间,当开始时间不同时,任务的执行时间也肯定不同,但是间隔,重复次数是相同的。当根据Cron表达式去构建触发器时,类似的,也是一个开始时间点,用于计算任务执行的时间,而不是任务真正执行的时间。
- endTime:触发器的结束时间,当使用日期,间隔,重复次数构建触发器时,这个属性没啥用,当根据Cron表达式去构建触发器时,它用于计算任务最后一次执行的时间,与startTime类似,它只是用于计算最后执行的时间,而不是任务最后一次执行的具体时间。
3、MisFire策略
当由于某些原因导致任务在指定时间没有执行时(例如没有足够的线程,日程意外被关闭等等),当任务的requestRecovery为true,需要恢复时,提供日程恢复的策略。这会根据触发器类型的不同而不同。这里先略过,在介绍具体的Trigger类型时讲述这部分的内容。
4、Calendar接口
Calendar接口的功能相当于在任务的执行周期内添加日期相关的过滤条件,使得任务执行时将这些时间段排除掉。
除CronCalendar的其他Calendar,都是在当前重复日期周期内排除特定时间段。
首先需要判断当前时间是否在任务的执行周期之内,所有的这些calendar实现类都有一个baseCalendar参数,它是基准时间,根据重复间隔,重复次数时可以判断任务每次执行的时间和任务最后结束的时间。
其次需要判断在当前周期内需要排除那些时间段,最小的时间段单位为毫秒,普通的时间段单位为天,例如AnnualCalendar排除一年之内的某一天或某几天。WeeklyCalendar可以排除一周之内的星期几。
Calendar的名称已经表示了重复周期,Annual是每年,Weekly是每周,Monthly是每月,HolidayCalendar是特殊的日期,DailyCalendar是每天。
注:使用这些Calendar时,不能跨周期,
例如WeeklyCalendar,不能设定这周的星期一不执行,下周的星期二不执行,下下周的星期三不执行。如果需要满足这样的需求,只能扩大日期的周期范围,这里可以通过MonthlyCalendar将这些时间段都排除在外。HolidayCalendar可以随意指定任何的日期,它没有周期间隔,它代表一些特殊的日期。