【5】SimpleTrigger

参考链接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-timeend-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);

熟悉TriggerBuilderSimpleScheduleBuilder定义的一些方法,还可以发现一些其他上面的例子中没有列举出来的选项。

另外,TriggerBuilder(以及quartz其他的builders) ,在你没有明确的为一些属性指定值的时候,builder会将其设置为一些有意义的值。比如没有设置withIdentity()方法的值时候,TriggerBuilder会为你的trigger生成一个随机的名字;如果没有调用startAt()那默认就是当前的时间。

SimpleTrigger Misfire Instructions

SimpleTrigger 有一些instructions 可以通知quartz在misfire 出现的时候告诉quartz应该做些什么。这些instructionsSimpleTrigger 有对应的常量定义(可以参阅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 instancestate动态的从各种MISFIRE instructions 中选取合适的。可以查看SimpleTrigger.updateAfterMisfire()的JavaDoc文档,详细描述了动态行为的细节。

通过SimpleSchedulerBuilder的simpleSchedule指定misfire instruction:

 trigger = newTrigger()
    .withIdentity("trigger7", "group1")
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(5)
        .repeatForever()
        .withMisfireHandlingInstructionNextWithExistingCount())
    .build();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值