Quartz2.2.x官方文档2.2.X—第三章 5.SimpleTrigger

Quartz 教程


Table of Contents | ‹ Lesson 4 | Lesson 6 ›

课程 5: SimpleTrigger

SimpleTrigger 应该可以满足你的调度需求,如果你需要在一个特定时间完成一个工作,或者在一个指定的时间内重复执行。例如,你想要触发器在2015年1月13日11:23:54秒AM触发,或者你想它在这个时间点每10秒再触发5次。

有了这些描述,你可能会发现一个SimpleTrigger触发器包含:start-time、end-time、repeat count,和repeat interval。这些属性都是你所了解的,只有一些对于end-time属性的特殊说明。

重复次数可以为0,一个正数,或者一个常量值SimpleTigeer.REPEAT_INDEFINITELY。重复间隔属性必须是0,或者一个正long类型,表示几毫秒。注意重复讲个为0将会导致"重复次数"的的触发器触发在同时执行。

如果你还不熟悉Quartz的DateBulder类,你可能会发现它有助于帮助你计算你触发器的触发时间,根据你创建的StartTime(或者endTime)。

endTime属性(如果你指定了) 覆盖重复计数属性。如果你希望创建一个触发器,例如每10秒触发一次,直到某个时间 - 而不是计算它在开始时间和结束时间的重复次数,你可以指定结束时间,然后使用REPEAT_INDEFINITELY的重复次数。

SimpleTrigger实例使用TriggerBuider构建(关于触发器的主要属性)和SimpleScheduleBuider() instances are built using TriggerBuilder (for the trigger’s main properties) and SimpleScheduleBuilder (SimpleTrigger-specific属性). 使用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();

构造一个指定时间开始的触发器,接着每十秒执行1次,执行10次:


  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();

构造一个在未来5分钟触发一次的触发器:


  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();

构造一个当前时间开始的触发器,每5分钟触发一次,直到22:00分结束:


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

构造一个在一小时内将会触发的触发器,接着每2小时触发一次,直到永远:


  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和SimpleScheduleBuider的所有可用方法,这样你就可以熟悉你所有的选项,而这些选项上面例子可能没有。

注意TriggerBuilder (Quartz的其他构造器)没有显示指定属性时,会默认设置一个合理的属性。例如: 如果你没有调用*withIdentity*之一的方法,那么TriggerBuilder将会自动生成一个随机trigger的名字;如果你没有调用*startAt(..)*那么就会假定使用当前时间。

SimpleTrigger失败指令

SimpleTrigger有几个指令可用用来告知Quartz在失败时做什么。(失败情况在课程4:更多Triggers介绍)。这些指令被定义为SimpleTrigger的常量(包括JavaDoc所介绍的行为)。这些指令包含:

SimpleTrigger失败指令常量


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实例的状态。JavaDoc的 SimpleTrigger.updateAfterMisfire()方法解释这种动态行为信息。

当构建SimpleTriggers, 你可以设置简单调度程序的失败指令(通过SimpleSchedulerBuilder):


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

 

代码段 小部件

Code snippet widgets

轻灵划译

数据来源:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章