参考链接http://www.quartz-scheduler.org/documentation/quartz-2.2.x/tutorials/tutorial-lesson-05.html
SimpleTrigger: 如果你的job需要在指定的时间执行,或者要间断的不断地执行,SimpleTrigger就能满足这些需求。比如,让你的触发器在2015-01-13 11:23:54
触发,10秒执行一次,连续执行5次。
start-time, end-time, repeat count, 以及repeat interval, 在SimpleTrigger中设置这些参数就可以达到目的。
- repeat count: 重复次数的设置可以是0, 正数,或者常量
SimpleTrigger.REPEAT_INDEFINITELY
- repeat interval: 0, 正数,可以设置分钟和毫秒数 。如果repeat interval被设置为0,在trigger 执行repeat count次数的时候会出现trigger并发去触发的情况(调度程序几乎是同时去操作这些trigger)
- startTime: 设置trigger触发的时间
- endTime: 如果指定了
endTime
这个属性的话,会重写repeat count
属性。比如创建一个每10分钟就会触发的trigger,并为这个trigger设置了endTime属性,这样程序就不需要计算在start-time
和end-time
执行了多少次。可以在指定end-time
的同时也将repeat count
设置为REPEAT_INDEFINITELY
常量(或repeat count
指定一个比较大的值,这个值足以超过 trigger在end-time
到来之前执行的实际次数)。
SimpleTrigger
实例通过TriggerBuilder
(for the trigger’s main properties)和SimpleScheduleBuilder
(for the SimpleTrigger-specific properties)创建,通过如下代码导入他们的静态方法:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
下面是一些defining triggers with simple schedules
的例子,可以从中比较他们的异同:
创建一个不会重复的在指定时间执行的trigger
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.withIdentity("trigger1", "group1")
.startAt(myStartTime) // some Date
.forJob("job1", "group1") // identify job with name, group strings
.build();
创建一个每10分钟执行一次、执行10次、在指定时间执行的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();
创建一个5分钟后、只会执行一次的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会在下一个小时的0分0秒执行,然后是一直是每两个小时执行一次
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其他的builders) ,在你没有明确的为一些属性指定值的时候,builder会将其设置为一些有意义的值。比如没有设置withIdentity()
方法的值时候,TriggerBuilder
会为你的trigger生成一个随机的名字;如果没有调用startAt()
那默认就是当前的时间。
SimpleTrigger Misfire Instructions
SimpleTrigger
有一些instructions
可以通知quartz在misfire
出现的时候告诉quartz应该做些什么。这些instructions
在SimpleTrigger
有对应的常量定义(可以参阅JavaDoc文档)。这些instructions
包括:
SimpleTrigger中的Misfire Instruction 常量
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
在先前文章中使用的triggers都默认使用了Trigger.MISFIRE_INSTRUCTION_SMART_POLICY
instruction, 这是默认的instruction对于所有的trigger类型来说。
如果smart policy
instruciton被使用了,SimpleTrigger
会基于configuration和SimpleTrigger instance
的state
动态的从各种MISFIRE instructions
中选取合适的。可以查看SimpleTrigger.updateAfterMisfire()
的JavaDoc文档,详细描述了动态行为的细节。
通过SimpleSchedulerBuilder
的simpleSchedule指定misfire instruction
:
trigger = newTrigger()
.withIdentity("trigger7", "group1")
.withSchedule(simpleSchedule()
.withIntervalInMinutes(5)
.repeatForever()
.withMisfireHandlingInstructionNextWithExistingCount())
.build();