Quartz官方教程翻译系列-Lesson 5

原文地址
http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/tutorials/tutorial-lesson-05.html

第五课: 简单触发器
简单触发器应该满足你的任务调度需要,如果你需要一个任务在一个精确的指定的时间执行一次,或在一个指定的时间指定间隔执行数次。例如:如果你想要触发触发器在精确的 11:23:54 AM 在 1月13日,2015。或者如果你想要在这个时间触发,然后再触发多5次间隔10秒。

这个描述,你可能不会觉得惊讶找到SimpleTrigger包含的属性: 开始时间,和结束时间,重复次数,和一个重复间隔。这些属性都是精确的正如你期望的样子,仅有一些与结束时间相关的特殊说明。

重复次数可以为0,一个正整数,或者常量值 SimpleTrigger.REPEAT_INDEFINITELY,重复间隔属性可以为0或者一个正长整型,代表一个微妙数值。注意间隔 0 会引起重复次数触发同时发生(或者任务调度可以控制的最接近同时)。

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

结束时间属性(如果它是指定的) 覆盖重复次数。这是有用的如果想要创建好像没10秒就触发一次的直到,而不必计算开始时间和结束时间之间的重复次数,你可以简单地指定结束时间并使用一个重复次数
REPEAT_INDEFINITELY(你可以指定一个大数字的重复次数确定比结束时间到达之前触发器实际触发的次数多).

SimpleTrigger 实例使用TriggerBuilder 构建(触发器的主要属性)并且SimpleScheduleBuilder(主要为了简单触发器的指定属性)。使用这些构造器在DSLstyle ,使用以下的静态导入:

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

构建一个指定时间的触发器,每10秒重复一次:

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

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

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

构建一个触发器触发在下一个小时里,然后每两小时重复,一直:

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)会为未显式设置的属性选择一个合理的值。举例: 如果你调用一个
withIdentity(..) 方法,那么TriggerBuilder 会为你的触发器生成一个随机名字,如果你调用 startAt(..) 方法,那么假定是当前时间(立即)。

简单触发器哑火指令

简单触发器有几个命令可以在发生哑火的时候通知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

你应该回忆其他课中其他触发器有的Trigger.MISFIRE_INSTRUCTION_SMART_POLICY 指令可供使用,并且这个指令是全部触发器默认的。
如果'smart policy' 指令被使用,简单触发器会根据设置和指定的简单触发器状态实例在各种哑火指令中动态选择。

当构建简单触发器时,你指定哑火命令作为简单任务调度的一部分(如 SimpleSchedulerBuilder):

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

本文由博客一文多发平台 OpenWrite 发布!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容