SimpleTrigger介绍

  项目地址:  

    https://github.com/yuleiqq/quartz_example/tree/master/quartz_study

目录

 简介

SimpleTrigger 失败的指令


 简介

如果您需要在特定的时间点精确地执行一次作业,或者在特定的时间点执行一次作业,然后在特定的时间间隔重复一次,那么SimpleTrigger应该能够满足您的调度需求。例如,如果你想让触发器在2015年1月13日上午11:23:54准时发射,或者你想让它在那个时间发射,然后每10秒再发射5次。

有了这个描述,您可能不会惊讶地发现SimpleTrigger的属性包括:开始时间、结束时间、重复计数和重复间隔。所有这些属性都是您所期望的,只有一些与结束时间属性相关的特殊说明。

重复计数可以是0、正整数或常量值SimpleTrigger.REPEAT_INDEFINITELY。repeat interval属性必须为零,或正的长值,并且表示毫秒数。请注意,重复间隔为0将导致触发器的“重复计数”并发触发(或接近于调度程序所能管理的并发触发)。

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

endTime属性(如果已指定)覆盖repeat count属性。这可能是有用的,如果您希望创建一个触发器等火灾每10秒,直到一个给定的时刻,而不是计算的次数,将重复start-time 和 end-time, 您可以简单地指定的end-time,然后使用重复计数REPEAT_INDEFINITELY(你甚至可以指定一些大量的重复计算,肯定会超过触发的次数会火在end-time到来之前)。

SimpleTrigger实例是使用TriggerBuilder(针对触发器的主要属性)和SimpleScheduleBuilder(针对特定于SimpleTrigger的属性)构建的。要在DSL风格中使用这些构建器,请使用静态导入:

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

下面是一些定义触发器的简单例子,通读一下,因为它们每个都至少显示了一个新的/不同的点:

1、为特定的时间点建立一个触发器,不要重复:

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

2、 为特定的时间点建立一个触发器,然后每十秒重复十次:

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

3、建立一个触发点,在下一个小时开始时触发,然后每两个小时重复一次,直到永远:

  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的其他生成器)通常会为您没有显式设置的属性选择一个合理的值。如果没有调用*startAt(..)*,则假定当前时间(立即)。

SimpleTrigger 失败的指令

SimpleTrigger有几个指令,可以用来通知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

你应该回想一下以前的课程,所有的触发器都有触发器。可以使用MISFIRE_INSTRUCTION_SMART_POLICY指令,该指令也是所有触发器类型的默认值。

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

在构建simpletrigger时,您可以指定misfire指令作为简单调度的一部分(通过simplescherbuilder):


  trigger = newTrigger()
    .withIdentity("trigger7", "group1")
    .withSchedule(simpleSchedule()
        .withIntervalInMinutes(5)
        .repeatForever()
        .withMisfireHandlingInstructionNextWithExistingCount())
    .build();
发布了192 篇原创文章 · 获赞 254 · 访问量 76万+

猜你喜欢

转载自blog.csdn.net/yulei_qq/article/details/104009702