第五课 SimpleTrigger

如果你需要在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务,SimpleTrigger应该能满足你的调度需求。例如,你希望触发器在2015年1月13日上午11:23:54准时触发,或是希望在那个时间点触发,然后再重复触发5次,每隔10秒一次。有了这样的描述,你就不会对SimpleTrigger包含的参数感到奇怪:开始执行时间,结束执行时间,重复次数和重复执行间隔时间。所有的参数都是你期望的那样,只是关于结束执行时间参数有两条特别的提示。

重复次数可以为0,正整数或是SimpleTrigger.REPEAT_INDEFINITELY常量值。重复执行间隔必须为0或长整数(long类型),它表示毫秒数的值。注意如果重复执行间隔时间为0会导致数量为“重复次数”的触发器并发执行(或是在调度器控制下接近并发执行)。

如果你还不熟悉Quartz的DateBuilder类,你尝试创建日期对象时会发现它非常方便地根据startTimeUtc 或 endTimeUtc参数计算触发器的触发时间。

EndTimeUtc参数(如果被指定)会覆盖重复次数参数的效果。当你希望创建一个触发器,每隔10秒被触发一次直到给定的截止时间,而不是必须完成在给定的开始和结束时间段内的触发次数,使用endTime参数会非常方便,你可以仅仅指定一个end-time参数,并且将重复次数设置为REPEAT_INDEFINITELY(你甚至可以将重复次数指定为非常大的值,确保比结束执行时间到达前实际要执行的次数大就行)。

下面是使用简易调度器定义触发器的几个案例,请通读一遍,每个例子都至少展示了一个新的、不同的知识点:

创建触发器时指定具体的时间,不重复执行:

 // trigger builder creates simple trigger by default, actually an ITrigger is returned
ISimpleTrigger trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.StartAt(myStartTime) // some Date
.ForJob("job1", "group1") // identify job with name, group strings
.Build();

创建触发器时指定具体的时间,然后每隔10秒触发一次,共重复触发10次:

 trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.StartAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied
.WithSimpleSchedule(x => x
.WithIntervalInSeconds()
.WithRepeatCount()) // note that 10 repeats will give a total of 11 firings
.ForJob(myJob) // identify job with handle to its JobDetail itself
.Build();

创建触发器,5分钟后将会触发一次:

trigger = (ISimpleTrigger) TriggerBuilder.Create()
.WithIdentity("trigger5", "group1")
.StartAt(DateBuilder.FutureDate(, IntervalUnit.Minute)) // use DateBuilder to create a date in the future
.ForJob(myJobKey) // identify job with its JobKey
.Build();

创建触发器时立即触发,然后每隔5分钟触发一次,直到22:00:

trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes()
.RepeatForever())
.EndAt(DateBuilder.DateOf(, , ))
.Build();

创建触发器时,在下一个整点小时触发,然后每隔2小时触发一次,永不停歇:

 trigger = TriggerBuilder.Create()
.WithIdentity("trigger8") // because group is not specified, "trigger8" will be in the default group
.StartAt(DateBuilder.EvenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))
.WithSimpleSchedule(x => x
.WithIntervalInHours()
.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别的创建类)在你没有明确设置参数值时一般会选择合理的值。例如,如果你没有调用withIdentity方法,TriggerBuilder会为你的触发器产生一个随机的名字,如果你没有调用startAt方法,它会假设是立即触发。

SimpleTrigger的触发失败指令

SimpleTrigger有几条指令,用来告知Quartz当触发失败时该如何操作。(在第四课更多关于触发器已经介绍过触发失败的情况)。这些指令在SimpleTrigger类中设计成常量(包含JavaDoc描述了它们的行为)。指令有:

SimpleTrigger的触发失败指令常量:

•MisfireInstruction.IgnoreMisfirePolicy
•MisfirePolicy.SimpleTrigger.FireNow
•MisfirePolicy.SimpleTrigger.RescheduleNowWithExistingRepeatCount
•MisfirePolicy.SimpleTrigger.RescheduleNowWithRemainingRepeatCount
•MisfirePolicy.SimpleTrigger.RescheduleNextWithRemainingCount
•MisfirePolicy.SimpleTrigger.RescheduleNextWithExistingCount

回顾前面的课程可以知道:所有的触发器都可以使用Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令,并且这条指令也是所有触发器的默认指令。

如果使用“智能策略”指令,SimpleTrigger会从多条触发失败指令集中根据配置和SimpleTrigger实例的状态动态地选择指令。文档中SimpleTrigger的SimpleTrigger.UpdateAfterMisfire()方法解释了动态选择行为更详细的信息。
    当你创建SimpleTrigger时,可以通过SimpleSchedulerBuilder指定触发失败指令作为调度器的一部分。

 trigger = TriggerBuilder.Create()
.WithIdentity("trigger7", "group1")
.WithSimpleSchedule(x => x
.WithIntervalInMinutes()
.RepeatForever()
.WithMisfireHandlingInstructionNextWithExistingCount())
.Build();

[译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger的更多相关文章

  1. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers

    第四课 更多关于Triggers 跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数.前面已经提到过,有许多不同类型的触发器供你选择, ...

  2. [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails

    第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法 ...

  3. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第七课 触发监听器和作业任务监听器

    第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件 ...

  4. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第六课 CronTrigger

    第六课 CronTrigger CronTrigger比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间. 使用Simp ...

  5. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第八课 调度监听器

    第八课 调度监听器 调度监听器和触发监听器和触发监听器.作业任务监听器非常相似,只是调度监听器在调度器内接收通知事件,而不需要关联具体的触发器或作业任务事件. 跟调度监听器相关的事件,添加作业任务/触 ...

  6. Quartz 框架 教程(中文版)2.2.x

    Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...

  7. Tensorflow 官方版教程中文版

    2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源,同日,极客学院组织在线TensorFlow中文文档翻译.一个月后,30章文档全部翻译校对完成,上线并提供电子书下载,该 ...

  8. GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台

    注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...

  9. tinyshop框架教程已在腾讯课堂开课

    php就业网简介:www.php91.net,专注于Thinkphp框架教程的php框架学习中心.同时也有小崔老师自学php的教程,与你一起成长哦 同时,php就业网教程部分:http://www.p ...

随机推荐

  1. PAT 甲级 1064 Complete Binary Search Tree

    https://pintia.cn/problem-sets/994805342720868352/problems/994805407749357568 A Binary Search Tree ( ...

  2. 使用robot封装一个模拟键盘复制粘贴并按下回车的方法

    /** * 复制数据到剪切板并粘贴出来并按下回车 * @param writeMe 需要粘贴的地址 * @throws java.awt.AWTException */ public void use ...

  3. Genymotion-ARM-Translation_v1.1安装报“an error occured while deploying the file”

    如上图,在将Genymotion-ARM-Translation_v1.1.zip拖动Genymotion虚拟机中报了图中错误,在百度后找到了解决办法,下面是我的操作步骤 1.下载re管理器之类的ap ...

  4. yiled(),wait(),sleep()方法区别

    yiled():让步 wait():等待 sleep():休眠 yiled是让步,会使当前线程由运行状态进入到就绪状态,让其他优先级高线程先执行,但是如果是同一优先级的线程,那么谁先执行就不确定了.它 ...

  5. three.js:Failed to execute 'texImage2D' on 'WebGLRenderingContext解决方案

    three.js加载图片时,出现Failed to execute 'texImage2D' on 'WebGLRenderingContext .Tainted canvases may not b ...

  6. 【AGC003F】Fraction of Fractal

    Description ​ 原题链接 ​ Solution ​ 神题. ​ 定义一个上边界或下边界的格子为"上下接口",当且仅当上下边界该位置的格子都是黑色的. ​ "左 ...

  7. 【ZJOI 2018】线图(树的枚举,hash,dp)

    线图 题目描述 九条可怜是一个热爱出题的女孩子. 今天可怜想要出一道和图论相关的题.在一张无向图 $G$ 上,我们可以对它进行一些非常有趣的变换,比如说对偶,又或者说取补.这样的操作往往可以赋予一些传 ...

  8. 【bzoj3751】 Hnoi2014—画框

    http://www.lydsy.com/JudgeOnline/problem.php?id=3571 (题目链接) 题意 给出一个$2*N$个点的二分图,$N*N$条边,连接$i$和$j$的边有两 ...

  9. 【linux之文件查看,操作,权限管理】

    一.shell如何处理命令 1.shell会根据在命令中出现的空格字符,将命令划分为多个部分 2.判断第一个字段是内部命令还是外部命令 内部命令:内置于shell的命令(shell builtin) ...

  10. 面试自我介绍之English

    Version 1 Hello, everyone. I am so glad to stand here. First of all, I will introduce myself. My nam ...