Quartz教程四--Trigger介绍

与job同样,trigger也很容易使用,可是还有一些扩展选项须要理解,以便更好地使用quartz。trigger也有不少类型,能够根据实际须要来选择。java

最经常使用的两种trigger会分别在教程五:SimpleTriggers教程六:CronTrigger中讲到;git

Trigger的公共属性

全部类型的trigger都有TriggerKey这个属性,表示trigger的身份;除此以外,trigger还有不少其它的公共属性。这些属性,在构建trigger的时候能够经过TriggerBuilder设置。github

trigger的公共属性有:web

  • jobKey属性:当trigger触发时被执行的job的身份;ui

  • startTime属性:设置trigger第一次触发的时间;该属性的值是java.util.Date类型,表示某个指定的时间点;有些类型的trigger,会在设置的startTime时当即触发,有些类型的trigger,表示其触发是在startTime以后开始生效。好比,如今是1月份,你设置了一个trigger–”在每月的第5天执行”,而后你将startTime属性设置为4月1号,则该trigger第一次触发会是在几个月之后了(即4月5号)。spa

  • endTime属性:表示trigger失效的时间点。好比,”每个月第5天执行”的trigger,若是其endTime是7月1号,则其最后一次执行时间是6月5号。线程

其它的属性,会在下面的小节中解释。code

优先级(priority)

若是你的trigger不少(或者Quartz线程池的工做线程太少),Quartz可能没有足够的资源同时触发全部的trigger;这种状况下,你可能但愿控制哪些trigger优先使用Quartz的工做线程,要达到该目的,能够在trigger上设置priority属性。好比,你有N个trigger须要同时触发,但只有Z个工做线程,优先级最高的Z个trigger会被首先触发。若是没有为trigger设置优先级,trigger使用默认优先级,值为5;priority属性的值能够是任意整数,正数、负数均可以。orm

注意:只有同时触发的trigger之间才会比较优先级。10:59触发的trigger老是在11:00触发的trigger以前执行。对象

注意:若是trigger是可恢复的,在恢复后再调度时,优先级与原trigger是同样的。

错过触发(misfire)

trigger还有一个重要的属性misfire;若是scheduler关闭了,或者Quartz线程池中没有可用的线程来执行job,此时持久性的trigger就会错过(miss)其触发时间,即错过触发(misfire)。不一样类型的trigger,有不一样的misfire机制。它们默认都使用“智能机制(smart policy)”,即根据trigger的类型和配置动态调整行为。当scheduler启动的时候,查询全部错过触发(misfire)的持久性trigger。而后根据它们各自的misfire机制更新trigger的信息。当你在项目中使用Quartz时,你应该对各类类型的trigger的misfire机制都比较熟悉,这些misfire机制在JavaDoc中有说明。关于misfire机制的细节,会在讲到具体的trigger时做介绍。

日历(calendar)

Quartz的Calendar对象(不是java.util.Calendar对象)能够在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。好比,能够建立一个trigger,每一个工做日的上午9:30执行,而后增长一个Calendar,排除掉全部的商业节日。

任何实现了Calendar接口的可序列化对象均可以做为Calendar对象,Calendar接口以下:

package org.quartz;

public interface Calendar {

    public boolean isTimeIncluded(long timeStamp);

    public long getNextIncludedTime(long timeStamp);

}

注意到这些方法的参数类型为long。你也许猜到了,他们就是毫秒单位的时间戳。即Calendar排除时间段的单位能够精确到毫秒。你也许对“排除一成天”的Calendar比较感兴趣。Quartz提供的org.quartz.impl.HolidayCalendar类能够很方便地实现。

Calendar必须先实例化,而后经过addCalendar()方法注册到scheduler。若是使用HolidayCalendar,实例化后,须要调用addExcludedDate(Date date)方法从调度计划中排除时间段。如下示例是将同一个Calendar实例用于多个trigger:

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

构造trigger的细节将在接下来的几节中讲到。就如今,只须要知道上面的代码建立了两个trigger,都是天天执行一次。可是在Calendar定义的时间段内,trigger的执行被跳过。

org.quartz.impl.calendar包下有各类Calendar的实现,根据须要进行选择。

相关文章
相关标签/搜索