Quartz的Trigger怎么理解

773 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

1. Trigger简介

Trigger即触发器,在Quartz框架中支持多种类型的触发器

Trigger作为触发器顶层接口,其相关实现的层次结构:

image.png

2. Trigger下的四大触发器

  • SimpleTrigger:简单任务触发器,时分秒轮询,类似java的timer
    • 可设置触发时间、触发间隔、触发次数
  • CalendarIntervalTrigger:基于日历扩展了SimpleTrigger,在时分秒基础上增加年月日轮询
  • DailyTimeIntervalTrigger:可实现一定时间段内周期性执行任务
    • 可设置每日执行,并设置任务触发的开始时间、结束时间、执行间隔
    • 如:每天的8点-18点之间每半小时执行一次
  • CronTrigger:使用字符串的cron表达式来定义触发器执行策略,cron是linux平台时间格式
  • MutableTrigger:作为统一的触发器转换类型,以上四种触发器类都实现了该接口
  • CoreTrigger:仅提供hasAdditionalProperties()方法,返回布尔值

四种触发器对应的建造者类型:

image.png

3. TriggerBuilder

触发器创建时采用了建造者模式

创建Trigger触发器时,通过建造者模式对应的TriggerBuilder类完成创建

 // 创建触发器:触发器名、触发器组、触发器时间、触发器类型
 CronTrigger trigger = TriggerBuilder.newTrigger()           
     .withIdentity(TriggerKey.triggerKey(name,groupName))
     .withSchedule(CronScheduleBuilder.cronSchedule(time))
     .build();
  1. 首先采用静态方法newTrigger()创建一个TriggerBuilder实例对象,
  2. 并使用链式操作完成相关属性的设置
    • 使用withIdentity()等方法添加触发器名称、分组等信息
    • 使用startNow()/startAt/endAt等方法设置触发器触发时间
    • 使用forJob()等方法设置触发器关联任务
    • 使用withSchedule(ScheduleBuilder schedBuilder)设置当前触发器对象的建造者对象,默认是SimpleScheduleBuilder类型,创建SimpleTrigger对象
    • 使用modifiedByCalendar()设置Quartz中的日历对象
  3. 最后使用build()方法创建Trigger对象。
    • build()方法中,如果没有设置触发器建造者,会默认创建一个SimpleScheduleBuilder类的建造者对象
    • 然后通过触发器建造者对象的build()方法创建一个具体的触发器对象,并将对象以MutableTrigger类型返回
      • MutableTrigger类型作为中间类型,四种触发器对象统一转成MutableTrigger类型返回,并在接收时转为对应类型
    • 触发器创建完成后,会将当前建造者对象的配置属性设置给触发器对象
    • 最后返回创建好的触发器对象,可以使用具体类型或Trigger类型接收
 //build()完成触发器的最终创建
 public T build() {
     if (this.scheduleBuilder == null) {
         this.scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
     }

     MutableTrigger trig = this.scheduleBuilder.build();
     trig.setCalendarName(this.calendarName);
     trig.setDescription(this.description);
     trig.setStartTime(this.startTime);
     trig.setEndTime(this.endTime);
     if (this.key == null) {
         this.key = new TriggerKey(Key.createUniqueName((String)null), (String)null);
     }
     trig.setKey(this.key);
     if (this.jobKey != null) {
         trig.setJobKey(this.jobKey);
     }
     trig.setPriority(this.priority);
     if (!this.jobDataMap.isEmpty()) {
         trig.setJobDataMap(this.jobDataMap);
     }

     return trig;
 }