[译]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 ...
随机推荐
- iOS 怎么自定制推送声音呢?(APP运行时和APP进入后台时)
说明: 一般如果修改了apple官方的推送声音后,则APP进入后台后,推送会播放开发者自定制的推送声音,而用户在使用APP(也就是APP运行时)的时候,一般是不会有推送声音,因为此时的推送内容已经呈现 ...
- Objective-C KVC讲解,包你看懂会用
KVC:Key Value Coding,取其三个单词首字母浓缩而成.直白翻译过来就是键值编码,什么意思呢?简单来说,就是操作一个对象,也可以像操作字典一样,通过key来取值和赋值. 我们先创建一个H ...
- php框架的制作原理
php框架的制作原理 (2012-08-16 14:25:55) 转载▼ 标签: php框架制作 杂谈 分类: php index.php 主入口文件 <?php define('ISEXIS ...
- 【转载】Vue项目中的文件/文件夹命名规范
文件或文件夹的命名遵循以下原则: index.js 或者 index.vue,统一使用小写字母开头的(kebab-case)命名规范 属于组件或类的,统一使用大写字母开头的(PascalCase)命名 ...
- Delphi开发单机瘦数据库程序要点(后缀cds)
一.概述 Delphi作为Windows下的一种快速开发工具,不仅能开发一般的Windows应用程序,而且还具有强大的数据库应用程序开发功能.Delphi本身提供了对BDE,ODBC,ADO和Inte ...
- BeautifulSoup的find()和findAll()
BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的).借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签. 首先find ...
- idea的protobuf使用
1.安装插件 2.添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&qu ...
- MT【151】传球问题
(清华2017.4.29标准学术能力测试10) 甲.乙.丙.丁四人做相互传球的游戏,第一次甲传给其他三人中的一人,第二次由拿到球的人再传给其他三人中的一人,这样的传球共进行了$4$次,则第四次球传回甲 ...
- Find First and Last Position of Element in Sorted Array - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Find First and Last Position of Element in Sorted Array - LeetCode 注意点 nums可能 ...
- typescript数据类型
// 布尔类型 let isDone: boolean = false; // 数字类型 所有数字都是浮点数 number let decLiteral: number = 6; let hexLit ...