您的位置:首页 > 编程语言 > Java开发

[译]Java定时任务调度-Quartz文档(五)SimpleTrigger

2017-03-24 13:41 225 查看

Simple Trigger

Simple Trigger一般适用在某个时间点执行任务,或者从某个时间点开始以固定间隔的时间窗口重复执行某任务。例如,如果你想在2015年2月13号上午11:23:54秒启动触发器,或者从这个时间点启动,并以10秒为间隔,重复执行五次。

通过以上描述,SimpleTrigger的一些属性就显而易见了:开始时间、结束时间、重复次数和重复间隔。这些属性义如其名,只需要稍微注意一下结束时间这个属性即可。

重复次数的取值可以是0、整数或者常数SimpleTrigger.REPEAT_INDEFINITELY。重复间隔必须是0或者正的long类型,单位是毫秒。注意,当时间间隔为0时,’repeat count’次的任务会以并发的形式同时执行。

如果你对Quartz的DateBuilder类不是很熟悉,最好根据开始时间或者结束时间先计算好trigger的启动次数。

结束时间这个属性会影响到重复次数这个属性。这一点应用在诸如【启动一个每10秒执行一次的任务,但是在一个固定的时间点终止】这类的任务,这样做就不用根据开始时间、结束时间和时间间隔来计算执行次数了,设定了结束时间后,可以将repeat count设置为REPEAT_INDEFINITELY(你甚至可以将repeat count设置为一个超大的数,以保证在end time之前,绝对不会执行完)。

SimpleTrigger实例通常是通过TriggerBuilder或者SimpleScheduleBuilder创建的。要通过DSL-style来使用这些builder,可以引入如下内容:

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


下面的例子介绍了多种定义方式,每种都有些许不同:

创建一个特定时间点的trigger,无重复执行:

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


创建一个特定时间点的trigger,每十秒执行一次:

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,五分钟后执行一次:

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


创建一个trigger,并立即执行,然后每五分钟执行一次,直到22:00:

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


创建一个trigger,在下个整点执行,并每两个小时执行一次,永远重复下去:

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的所有方法,以便熟悉除了上面提到的之外的方法。

注意,如果某些属性你没有指定值,那么Quartz会为你制定一个默认值。例如,如果没有调用withIdentity,那么Quartz会随机为你的trigger生成一个名字,如果没有调用startAt,那么Quartz会以当前时间最为开始时间。

SimpleTrigger Misfire Instructions

SimpleTrigger定义了一些指令,用来指定“错过调用”时Quartz应该如何做。这些指令被定义为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类型都有Trigger.MISFIRE_INSTRUCTION_SMART_POLICY

,但是对于不同的类型,这个指令的行为有所不同。

如果使用了‘smart policy’,SimpleTrigger会根据给定SimpleTrigger实例的配置和状态动态的选择指令,JavaDoc中的SimpleTrigger.updateAfterMisfire()方法介绍了这个动态选择行为的细节。

在创建SimpleTriggers时,可以通过SimpleSchedulerBuilder来指定misfire instruction作为调度的一部分。如下所示:

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


原文链接:

http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-05.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息