【4】More About Triggers

参考链接http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-04.html
跟jobs一样,triggers也是很容易掌握的,在你真正完全放开使用quartz时,还是应该去注意和理解triggers的很多可定制化的选项。
如先前文章所述,对于不同的调度任务可以使用不同的triggers。

所有的trigger 都有TriggerKey 属性去标识他们,还有一些trigger共同的属性,这些属性可以使用TriggerBuilder 在定义trigger实例的时候进行指定。

下面是所有trigger types都会有的属性列表:

  • “jobKey”, 这个这个属性表示当trigger触发时指定哪个job应该被执行。

  • “startTime”, 表示trigger的schedule第一次生效执行的时间,它的值的类型是java.util.Date。对于有一些trigger类型来说,会准确的在startTime指定的时间开始运行。有的tirgger要等到startTime的时间才会去执行,这意味着可以定义一个trigger with a schedule, 这个schedule 定义的是 每月的第五天执行,现在是 “一月”,如果startTime设置的是4月1号,那么这个trigger在它执行之前还要有休假几个月呢?

  • “endTime”, 这个属性表示trigger的schedule在超过这个时间以后就不会执行了。比如的一个trigger的schedule设置为 “每个月的第五天执行”,endTime属性的值是”7月1号”, 那这个trigger的最后一次运行时间是”6月5号”。

Priority

当定义了很多triggers(或者在quartz的线程池里面有很多工作线程), quartz可能没有资源在同一时刻立马去执行这些triggers, 这时就想是不是应该让某些triggers优先执行,所以这时我们就可以为triggers设置优先级了。如果N个triggers在同一时刻执行,但是当前只能获得Z个工作线程,这样triggers的优先级排名前Z的优先执行。当没有为trigger设置priority属性的话,trigger默认的prioprity是5,priority的设置可以是正数或负数。

注:当trigger们会在同一个时刻去执行时,这时才会去比较priorities。10:59的trigger肯定会比11:00的trigger先执行。

当trigger的job被检测到要重新恢复执行时,它的优先级和原来的trigger一样。

Misfire Instructions

一个持久化的trigger错过了它的执行时间(a misfire occurs),由于scheduler被shutdown了或quartz的线程池里面没有可用的线程去执行job。不同的trigger类型有不同的misfire instructions。默认使用smart policy instruction, 根据trigger typeconfiguration产生动态的行为。当scheduler starts, 会去数据库里面搜索那些被misfired了持久化的trigger, 根据配置的misfire instructions 去更新他们。

在项目中使用quartz时,熟悉在定义trigger types所配置的misfire instruction

Calendars

在trigger被定义的时候,可以使用quartz的Calendar对象(不是java.util.Calendar),然后保存到schedule中。Calendars可以从trigger的firing schedule中去掉一些时间段。比如,创建一个trigger在 工作日的上午9:30 去触发一个job, 然后添加一个Calendar去排除所有的法定假日。

Calendar可以是任何序列化的实现了Calendar interface的对象, 如下:

The Calendar Interface
package org.quartz;

public interface Calendar {

  public boolean isTimeIncluded(long timeStamp);

  public long getNextIncludedTime(long timeStamp);

}

注意这些方法的参数类型都是long类型的,可以猜出它们是timestamps类型转成了毫秒的格式。这意味着calendar可以从毫秒级去分出很多时间段来,你可以把一整天都分出来。org.quartz.impl.HolidayCalendar可以方便的实现这一需求。

Calendars必须先实例化,然后通过scheduler的addCalendar进行注册。比如使用HolidayCalendar,实例化之后,将你想从scheduling中排除的日期 作为参数传给addExcludedDate(Date date)这个方法。同一个calendar可以被多个triggers使用。

Calendar Example
HolidayCalendar cal = new HolidayCalendar();
cal.addExcludedDate( someDate );
cal.addExcludedDate( someOtherDate );

sched.addCalendar("myHolidays", cal, false);


Trigger t = newTrigger()
    .withIdentity("myTrigger")
    .forJob("myJob")
    .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
    .modifiedByCalendar("myHolidays") // but not on holidays
    .build();

// .. schedule job with trigger

Trigger t2 = newTrigger()
    .withIdentity("myTrigger2")
    .forJob("myJob2")
    .withSchedule(dailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
    .modifiedByCalendar("myHolidays") // but not on holidays
    .build();

// .. schedule job with trigger2

上面的代码创建了两个triggers, 除了被calendar排除的日期,都会在每天的特定时刻执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值