(翻译)Quartz官方教程——第五课:SimpleTrigger

当你需要你的任务在某个特定时刻执行一次或者或者在特定的时间,以某个固定的时间间隔重复,那么SimpleTrigger 可以很好的满足你的需求。举个栗子,比如你想要触发器在2015年1月13号上午11:23:54触发,或者你想要在那个时间触发一次后,再以十秒钟的间隔触发五次。

通过以上描述,你可能就不会对SimpleTrigger包括开始时间、结束时间、重复次数和重复间隔这些属性感到惊讶了。所有这些属性都像你想的那样,只有结束时间属性有几个需要特别注意的地方。

重复次数可以是零,一个正整数或常数值SimpleTrigger.REPEAT_INDEFINITELY。重复间隔时间必须为零或者长整形正数,并且单位是毫秒。请注意,重复间隔为零会导致触发器的“重复计数”触发同时发生(或者几乎同时触发)。

如果你还不熟悉Quartz的DateBuilder类,则可能会发现它对计算触发器触发时间很有帮助,具体取决于您尝试创建的startTime(或endTime)。

endTime属性(如果指定)会覆盖重复次数属性。如果您希望创建一个触发器,例如每隔10秒触发一次,直到某个特定时刻——而不必计算在开始时间和结束时间之间重复的次数,则此功能非常有用。你可以轻松地指定结束时间并且使用REPEAT_INDEFINITELY作为重复次数(你甚至可以指定某个非常大的数字,只要它远大于在结束前的可能的触发次数)。

SimpleTrigger实例使用TriggerBuilder(设置触发器的主要属性)和SimpleScheduleBuilder(设置SimpleTrigger特定的属性)构建。要以DSL风格使用这些构建器,请使用静态导入:

import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:

下边是一些简单的触发器的定义,通读它们不要漏过一个,因为每段代码都至少有一个新的或不同的地方:

在特定时间点构建一个触发器,不重复:

SimpleTrigger trigger = (SimpleTrigger) newTrigger()
    .withIdentity("trigger1", "group1")
    .startAt(myStartTime) // some Date
    .forJob("job1", "group1") // identify job with name, group strings
    .build();

在特定时间点构建一个触发器,每十秒重复一次,共重复十次:

trigger = newTrigger()
    .withIdentity("trigger3", "group1")
    .startAt(myTimeToStartFiring)  // if a start time is not given (if this line were omitted), "now" is implied
    .withSchedule(simpleSchedule()
        .withIntervalInSeconds(10)
        .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings
    .forJob(myJob) // identify job with handle to its JobDetail itself                   
    .build();

构建一个只触发一次的触发器,在五分钟后执行:

trigger = (SimpleTrigger) newTrigger()
    .withIdentity("trigger5", "group1")
    .startAt(futureDate(5, IntervalUnit.MINUTE)) // use DateBuilder to create a date in the future
    .forJob(myJobKey) // identify job with its JobKey
    .build();

构建一个立即触发的触发器,然后每五分钟触发一次直到22:00:

trigger = newTrigger()
    .withIdentity("trigger7", "group1")
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(5)
        .repeatForever())
    .endAt(dateOf(22, 0, 0))
    .build();

构建一个在下个小时开始触发的触发器,然后每两小时触发一次,永远不停止:

  trigger = newTrigger()
    .withIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
    .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
    .withSchedule(simpleSchedule()
        .withIntervalInHours(2)
        .repeatForever())
    // note that in this example, 'forJob(..)' is not called
    //  - which is valid if the trigger is passed to the scheduler along with the job  
    .build();

    scheduler.scheduleJob(trigger, job);

花点时间阅读一下TriggerBuilder和SimpleScheduleBuilder中定义的方法,以便你可以了解到上述实例没有提到的可用选项。

注意如果你没有显示的设置某些属性,TriggerBuilder(也包括Quartz的其他构建器)通常会选择一个合理的值。比如:如果你没有调用withIdentity(..)方法,TriggerBuilder将为你的触发器生成一个随机的名称;如果你没有调用startAt(..)方法,则假定为当前时间(立即)

 SimpleTrigger的misfire策略

当misfire发生时,SimpleTrigger有多种策略可以使用。(在“第4课:关于触发器”中引入了misfire情况)。这些策略被定义为SimpleTrigger本身的常量(包括描述其行为的JavaDoc)。如下所示:

MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY
MISFIRE_INSTRUCTION_FIRE_NOW
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT
MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT

通过之前的教程我们知道所有的触发器都有Trigger.MISFIRE_INSTRUCTION_SMART_POLICY策略可用,而且这个策略也是所有触发器类型的默认策略。如果使用'智能策略'指令,则SimpleTrigger会根据给定SimpleTrigger实例的配置和状态,在其各种MISFIRE指令之间动态选择。SimpleTrigger.updateAfterMisfire()方法的JavaDoc解释了这种动态行为的确切细节。

当构建SimpleTriggers时,你可以指定misfire策略作为调度的一部分(通过SimpleSchedulerBuilder):

  trigger = newTrigger()
    .withIdentity("trigger7", "group1")
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(5)
        .repeatForever()
        .withMisfireHandlingInstructionNextWithExistingCount())
    .build();

猜你喜欢

转载自my.oschina.net/icebergxty/blog/1798255