[译]Quartz.NET 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers
第四课 更多关于Triggers
跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数。前面已经提到过,有许多不同类型的触发器供你选择,适用不同的调度需求。
你将会在第五课 Simple Trigger和第六课 Triggers学到这两种常用的触发器类型。
触发器通用属性
所有类型的触发器都有TriggerKey属性去跟踪触发器标识,除了这一个事实之外,还有许多其他的属性,对所有触发器类型都适用。这些通用属性在创建触发器定义时通过TriggerBuilder类来设定的。
下面的属性列表对所有类型的触发器都通用:
jobKey表示job实例的标识,触发器被触发时,该指定的job实例会执行。
StartTimeUtc 属性表示触发器的时间表首次被触发的时间。它的值是定义由指定日历时间的DateTimeOffset 对象。对于一些类型的触发器,会在启动时间触发,另一些触发器则仅仅是标示了调度器将要被触发的时间。这意味着你可以在调度器中存储一个触发器,例如每月的5号,如果现在是一月份,而startTime参数又设置为4月1日,那这样需要几个月后触发器才会第一次被触发。
EndTimeUtc 属性指定触发器的不再被触发的时间,换言之,调度器中的触发器定义为“每月的5号”,而且endTime设置为7月1日,那么6月5日将会是最后一次触发的日期。
其它的属性,更多更详细的讲解将会在接下来的子章节中进行讨论。
Priority(优先级)
有些时候,当你有许多触发器(或Quartz线程池中只有少数几个工作线程),Quartz可能没有足够的资源去触发所有的在同一时间段内排定好的触发器。既然这样,你可能期望控制哪个触发器能第一个获得Quartz空闲工作线程的调用。为了达到这个目的,你可以设定触发器的Priority属性。如果N个触发器在同一时间内被触发,但只有Z工作线程当前空闲可用,那么拥有最高优先级的Z触发器将会第一个被触发。如果你没有设置触发器的优先级,它将会使用默认的优先级,优先级值为5.任何Integer类型的值都可以作为优先级,正数负数都可以。
提示:优先级只是用于在同一时间被触发的触发器进行比较。一个安排在10:59分触发的触发器永远要比安排在11:00的触发器先执行。
提示:当一个触发器的作业任务发现设置了请求恢复参数,在恢复调度执行时的优先级和原来的一样。
触发失败指令
触发器另外一个重要的属性就是“misfireinstruction”。触发失败的情况是由于调度器被关闭导致存储的触发器错过了触发的时间,或是由于Quartz线程池内没有空闲的线程去执行作业任务。不同类型的触发器有不同的触发失败处理机制。默认情况下使用“智能策略”指令——基于触发器类型和配置的动态机制。当调度器启动时,它会查询所有存储的、触发失败的触发器,然后根据各自配置的触发失败指令更新触发器。当你开始在你的项目中使用Quartz时,你应该让自己熟悉在给定触发器类型上定义的触发失败指令和API上的文档解释。更多关于触发失败指令的详细信息将会在教程里每个触发器类型课程中作详细介绍。
Calendars(日历)
当触发器在调度器中创建和存储时,Quartz日历对象可以与触发器相关联。日历对触发器调度定义不包含的时间段非常方便。例如,你可以创建一个触发器,定义在每个工作日上午9:30分触发作业任务,另外添加一个日历表排除当中所有的假期。
日历对象可以是实现Calendar接口的任何可序列化的对象,如下所示:
Calendar接口
namespace Quartz
{
public interface ICalendar
{
string Description { get; set; } ICalendar CalendarBase { set; get; } bool IsTimeIncluded(DateTimeOffset timeUtc); DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
}
}
日历实例化和注册到调度器中必须通过addCalendar方法。如果你使用HolidayCalendar,初始化对象完成后,应该使用addExcludedDate(Datedate)方法方便将你希望从调度时间表中排除的日期添加到日历实例对象中。同一个日历实例对象可以应用于多个触发器,如下代码:
HolidayCalendar cal = new HolidayCalendar();
cal.AddExcludedDate(someDate); sched.AddCalendar("myHolidays", cal, false); ITrigger t = TriggerBuilder.Create()
.WithIdentity("myTrigger")
.ForJob("myJob")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, )) // execute job daily at 9:30
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build(); // .. schedule job with trigger ITrigger t2 = TriggerBuilder.Create()
.WithIdentity("myTrigger2")
.ForJob("myJob2")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, )) // execute job daily at 11:30
.ModifiedByCalendar("myHolidays") // but not on holidays
.Build(); // .. schedule job with trigger2
关于触发器结构/构建详细信息将会在后面两节课中介绍。现在,只需要相信上面的代码创建了两个触发器对象,每个触发器每天都会被触发。然而,任何发生在日历对象中排除的日期内的触发将会跳过。
可以查阅Quartz.Impl.Calendar 包目录下的几个Calendar实现类,估计有适合你需要的类
[译]Quartz.NET 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers的更多相关文章
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第六课 CronTrigger
第六课 CronTrigger CronTrigger比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间. 使用Simp ...
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger
第五课 SimpleTrigger 如果你需要在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务,SimpleTrigger应该能满足你的调度需求.例如,你希望触发器在2015年 ...
- [译]Quartz.Net 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails
第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法 ...
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第七课 触发监听器和作业任务监听器
第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件 ...
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第八课 调度监听器
第八课 调度监听器 调度监听器和触发监听器和触发监听器.作业任务监听器非常相似,只是调度监听器在调度器内接收通知事件,而不需要关联具体的触发器或作业任务事件. 跟调度监听器相关的事件,添加作业任务/触 ...
- [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介
第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...
- Quartz 框架 教程(中文版)2.2.x
Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quar ...
- Tensorflow 官方版教程中文版
2015年11月9日,Google发布人工智能系统TensorFlow并宣布开源,同日,极客学院组织在线TensorFlow中文文档翻译.一个月后,30章文档全部翻译校对完成,上线并提供电子书下载,该 ...
- GPS部标平台的架构设计(三) 基于struts+spring+hibernate+ibatis+quartz+mina框架开发GPS平台
注意,此版本是2014年研发的基于Spring2.5和Struts2的版本,此版本的源码仍然销售,但已不再提供源码升级的服务,因为目前我们开发的主流新版本是2015-2016年近一年推出的基于spri ...
随机推荐
- angularJS1笔记-(6)-自定义过滤器
html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 转 C#高性能Socket服务器SocketAsyncEventArgs的实现(IOCP)
原创性申明 本文作者:小竹zz 博客地址:http://blog.csdn.net/zhujunxxxxx/article/details/43573879转载请注明出处引言 我一直在探寻一个高性能 ...
- [BUAA_SE_2017]个人阅读作业 + 总结
个人阅读作业 银弹 银弹是指能让狼人一枪毙命的致命子弹,对于软件工程而言,我觉得是不存在银弹的.每一项软件开发都是极为特殊的,有特定的需求.特定的功能,如果存在银弹能够直击要害解决问题,那么软件的开发 ...
- MSSQL中IN是否用索引.....[转]
作者:no_mIss 用MSSQL时间快一年了,数据量有时会相对比较多,所以经常要优化,也看过很多资料,但大都有一句:IN.NOT IN不用索引,今天发此贴希望能有人参与讨论,到底IN用不用索引,如果 ...
- sublime Text 插件收录
插件 1.SublimeText3常用快捷键和优秀插件 2.常用的sublime text 3插件-1 主题 1.https://www.jianshu.com/p/1a1113213faf 2.ht ...
- Json的JsonValueProcessor方法
将对象转换成字符串,是非常常用的功能,尤其在WEB应用中,使用 JSON lib 能够便捷地完成这项工作. JSON lib能够将Java对象转成json格式的字符串,也可以将Java对象转换成xml ...
- MySQL数据库中varchar与char类型的区别
在数据库中建表时,需要给数据定义一个数据库中的数据库类型,当需要给String类型定义一个数据库中的类型时,可以看见有两个选择,一个是varchar,另一个是char,有很多人不清楚两者的区别,包括自 ...
- BZOJ1853_幸运数字
如果一个数字仅由6或者8构成,那么这个数字是幸运数字:如果一个数字是幸运数字的倍数,那么就是近似的幸运数. 给定区间,求有多少个近似幸运数字位于这个区间之内. 典型的容斥原理. 首先,弄出所有的幸运数 ...
- 【bzoj5166】[HAOI2014]遥感监测 贪心
题目描述 给出平面上 $n$ 个圆,在x轴上选出尽可能少的点,使得每个圆中至少有一个点.求这个最小点数. 输入 第1行: N R 分别表示激光点的个数和射电望远镜能检测到的半径 第2~N+1行: Xi ...
- Codeforces Round #526 Div. 1 自闭记
日常猝死. A:f[i]表示子树内包含根且可以继续向上延伸的路径的最大价值,统计答案考虑合并两条路径即可. #include<iostream> #include<cstdio> ...