Lesson 5: SimpleTrigger

23 篇文章 0 订阅

      如果您需要在特定时刻执行一次作业,或者在特定时刻执行作业,然后按特定时间间隔重复,则 SimpleTrigger应满足您的日程安排需求。例如,如果您希望触发器在2015年1月13日上午11:23:54正好触发,或者如果您希望它在那时触发,然后每十秒触发五次。

      通过这种描述,您可能不会惊讶地发现SimpleTrigger的属性包括:启动时间、结束时间、重复计数和重复间隔。所有这些属性正是您所期望的,只有一些与end-time属性相关的特殊注释。

     重复计数可以是零,正整数或常量值SimpleTrigger.REPEAT_INDEFINITELY。重复间隔属性必须为零或正整数,并表示毫秒数。请注意,重复的零间隔将导致触发器的“重复计数”触发同时发生(或者像调度程序可以管理的那样接近并发)。

      如果您还不熟悉Quartz的DateBuilder类,您可能会发现它有助于计算触发器的触发时间,具体取决于您尝试创建的startTime(或endTime)。

      结束时间属性(如果指定了的话)覆盖重复次数属性。如果您希望创建一个触发器,例如每隔10秒触发一次,直到给定的时刻 - 而不是必须计算它在开始时间和结束时间之间重复的次数,这可能很有用,可以简单地指定结束时间,然后使用REPEAT_INDEFINITELY的重复计数(你甚至可以指定一些巨大数字的重复计数,肯定会超过触发器在结束时间到来之前实际触发的次数) 。

      SimpleTrigger实例是使用TriggerBuilder(用于触发器的主要属性)和SimpleScheduleBuilder(用于SimpleTrigger特定属性)构建的。要以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();

在特定时刻构建触发器,然后每十秒重复十次:

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

 

构建一个现在将触发的触发器,然后每五分钟重复一次,直到22:00:

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

 

Build a trigger that will fire at the top of the next hour, then repeat every 2 hours, forever:

建立一个触发器,在接下来的一个小时开始,然后每两个小时重复一次,直到永远


  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的其他构建器)通常会为未明确设置的属性选择合理的值。例如:如果你没有调用* withIdentity(..)*方法之一,那么TriggerBuilder将为你的触发器生成一个随机名称如果你不调用* startAt(..)*则假定当前时间(立即)。

 

SimpleTrigger Misfire Instructions 

       SimpleTrigger有几条指令可用于告知Quartz发生失火时它应该做什么。(“第4课:更多关于触发器”)中介绍了未触发情况。这些指令在SimpleTrigger本身定义为常量(包括描述其行为的JavaDoc)。说明包括:

Misfire Instruction Constants of SimpleTrigger

SimpleTrigger的Misfire指令常量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

         您应该回想一下前面的经验,所有触发器都有MISFIRE_INSTRUCTION_SMART_POLICY指令可供使用,并且该指令也是所有触发器类型的默认指令。  

       如果使用了“smart policy”指令,SimpleTrigger会根据给定的SimpleTrigger实例的配置和状态,动态地在其各种错误的指令之间进行选择。SimpleTrigger.updateAfterMisfire()方法的JavaDoc解释了这个动态行为的确切细节。

 在构建simple触发器时,您可以将misfire指令指定为简单调度的一部分(通过SimpleSchedulerBuilder):


  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、付费专栏及课程。

余额充值