第四课 更多关于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的更多相关文章

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

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

  2. [译]Quartz.NET 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger

    第五课 SimpleTrigger 如果你需要在一个指定时间段内执行一次作业任务或是在指定的时间间隔内多次执行作业任务,SimpleTrigger应该能满足你的调度需求.例如,你希望触发器在2015年 ...

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

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

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

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

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

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

  6. [译]Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介

    第二课:QuartzAPI,Jobs和Triggers简介 Quartz API Quartz API 关键的几个接口: Scheduler:跟任务调度相关的最主要的API接口. Job:你期望任务调 ...

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

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

  8. Tensorflow 官方版教程中文版

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

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

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

随机推荐

  1. js 刷新当前页面会弹出提示框怎样将这个提示框去掉

    //禁止刷新提示window.onbeforeunload = function() { var n = window.event.screenX - window.screenLeft; var b ...

  2. datatables 排序 如何禁止

    $.extend( true, $.fn.dataTable.defaults, {     "searching": false,     "ordering" ...

  3. 简易版本vue的实现和注解

    本文参考的是前辈的简易版本Vue实现:http://www.cnblogs.com/canfoo/p/6891868.html,感谢.前辈GitHub地址:https://github.com/can ...

  4. es6 javascript对象方法Object.assign()

    es6 javascript对象方法Object.assign() 2016年12月01日 16:42:34 阅读数:38583 1  基本用法 Object.assign方法用于对象的合并,将源对象 ...

  5. 【vue】router-link 与 router-view

    1 router-link <router-link :to="{ path: '/hello', component: HelloWorld }">hello< ...

  6. .net webapi创建接口

    最近使用webapi做了一个用户数据库接口,方便其它网站接入验证用户,实现中解决出现的一些问题,做了一些记录, 1.返回显示为json数据 2.允许其他网站访问,刚开始没有设,在本地机测试时可以访问, ...

  7. [BZOJ1500][NOI2005]维修数列 解题报告 Splay

    Portal Gun:[BZOJ1500][NOI2005]维修数列 有一段时间没写博客了,最近在刚数据结构......各种板子背得简直要起飞,题目也是一大堆做不完,这里就挑一道平衡树的题来写写好了 ...

  8. Alpha 冲刺 —— 十分之六

    队名 火箭少男100 组长博客 林燊大哥 作业博客 Alpha 冲鸭鸭鸭鸭鸭鸭! 成员冲刺阶段情况 林燊(组长) 过去两天完成了哪些任务 协调各成员之间的工作 测试服务器并行能力 学习MSI.CUDA ...

  9. hdu6057 Kanade's convolution 【FWT】

    题目链接 hdu6057 题意 给出序列\(A[0...2^{m} - 1]\)和\(B[0...2^{m} - 1]\),求所有 \[C[k] = \sum\limits_{i \; and \; ...

  10. Linux及安全实践四——ELF文件格式分析

    Linux及安全实践四——ELF文件格式分析 一.ELF文件格式概述 1. ELF:是一种对象文件的格式,用于定义不同类型的对象文件中都放了什么东西.以及都以什么样的格式去放这些东西. 二.分析一个E ...