转载

Quartz官方教程翻译系列-Lesson 5

原文地址

http://www.quartz-scheduler.o...

第五课: 简单触发器

简单触发器应该满足你的任务调度需要,如果你需要一个任务在一个精确的指定的时间执行一次,或在一个指定的时间指定间隔执行数次。例如:如果你想要触发触发器在精确的 11:23:54 AM 在 1月13日,2015。或者如果你想要在这个时间触发,然后再触发多5次间隔10秒。

这个描述,你可能不会觉得惊讶找到 SimpleTrigger 包含的属性: 开始时间,和结束时间,重复次数,和一个重复间隔。这些属性都是精确的正如你期望的样子,仅有一些与结束时间相关的特殊说明。

重复次数可以为0,一个正整数,或者常量值 SimpleTrigger.REPEAT_INDEFINITELY ,重复间隔属性可以为0或者一个正长整型,代表一个微妙数值。注意间隔 0 会引起重复次数触发同时发生(或者任务调度可以控制的最接近同时)。

如果你不是熟悉 Quartz 的 DataBuilder 类,你可能会发现它有助于计算触发器的触发时间,具体取决于您试图创建的起始时间(或结束时间)。

结束时间属性(如果它是指定的) 覆盖重复次数。这是有用的如果想要创建好像没10秒就触发一次的直到,而不必计算开始时间和结束时间之间的重复次数,你可以简单地指定结束时间并使用一个重复次数

REPEAT_INDEFINITELY (你可以指定一个大数字的重复次数确定比结束时间到达之前触发器实际触发的次数多).

SimpleTrigger 实例使用 TriggerBuilder 构建(触发器的主要属性)并且 SimpleScheduleBuilder (主要为了简单触发器的指定属性)。使用这些构造器在DSLstyle ,使用以下的静态导入:

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

构建一个指定时间的触发器,每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();

构建一个触发器触发在下一个小时里,然后每两小时重复,一直:

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

花一些时间查看一下 TriggerBuilderSimpleScheduleBuilder 定义的语言中的所有可用方法,以便使您熟悉上面示例中未演示的可用选项。

注意 TriggerBuilder (还有Quartz的其他 builders)会为未显式设置的属性选择一个合理的值。举例: 如果你调用一个

withIdentity(..) 方法,那么 TriggerBuilder 会为你的触发器生成一个随机名字,如果你调用 startAt(..) 方法,那么假定是当前时间(立即)。

#### 简单触发器哑火指令

简单触发器有几个命令可以在发生哑火的时候通知Quartz。(哑火情况在"第四课:触发器更多相关"里面有介绍)。这些指令被定义在 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 指令可供使用,并且这个指令是全部触发器默认的。

如果'smart policy' 指令被使用,简单触发器会根据设置和指定的简单触发器状态实例在各种哑火指令中动态选择。

当构建简单触发器时,你指定哑火命令作为简单任务调度的一部分(如 SimpleSchedulerBuilder ):

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

本文由博客一文多发平台 OpenWrite 发布!

原文  https://segmentfault.com/a/1190000021336099
正文到此结束
Loading...