参考链接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 type
和configuration
产生动态的行为。当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排除的日期,都会在每天的特定时刻执行。