后端——框架——定时任务框架——Quartz——《官网》阅读笔记——第四章节(Trigger公共部分)——待补充

  第四章节介绍所有Trigger的共性。之后的第五章和第六章将分别介绍最常使用的SimpleTrigger和CronTrigger。

  第四章节的知识点大致分为三个部分

  1. 公共的属性。
  2. 当任务没有触发时的解决方案
  3. Calendar接口。

  在介绍这些,首先需要了解Trigger的类结构

1、Trigger类结构

  

  接口:

  1. Trigger:代表触发器,是Trigger类体系结构的顶级接口。
  2. CalendarIntervalTrigger:日期间隔触发器,根据日期的值,日期的单位,以及间隔的时间值,间隔时间单位,重复次数构成的触发器。
  3. CoreTrigger只有一个方法, hasAddtionalProperties。所有的Trigger都实现此接口。
  4. CronTrigger根据Cron表达式触发的Cron触发器。
  5. MutableTrigger包含设置公共属性的setXX方法,所有的Trigger都实现此接口
  6. SimpleTrigger简单触发器,只包含获取重复次数和间隔的getXX方法。
  7. 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可以随意指定任何的日期,它没有周期间隔,它代表一些特殊的日期。

猜你喜欢

转载自www.cnblogs.com/rain144576/p/12532475.html