[译]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接口

 1 namespace Quartz
 2 {
 3     public interface ICalendar
 4     {
 5         string Description { get; set; }
 6
 7         ICalendar CalendarBase { set; get; }
 8
 9         bool IsTimeIncluded(DateTimeOffset timeUtc);
10
11         DateTime GetNextIncludedTimeUtc(DateTimeOffset timeUtc);
12     }
13 } 

日历实例化和注册到调度器中必须通过addCalendar方法。如果你使用HolidayCalendar,初始化对象完成后,应该使用addExcludedDate(Datedate)方法方便将你希望从调度时间表中排除的日期添加到日历实例对象中。同一个日历实例对象可以应用于多个触发器,如下代码:

 1     HolidayCalendar cal = new HolidayCalendar();
 2     cal.AddExcludedDate(someDate);
 3
 4     sched.AddCalendar("myHolidays", cal, false);
 5
 6     ITrigger t = TriggerBuilder.Create()
 7         .WithIdentity("myTrigger")
 8         .ForJob("myJob")
 9         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
10         .ModifiedByCalendar("myHolidays") // but not on holidays
11         .Build();
12
13     // .. schedule job with trigger
14
15     ITrigger t2 = TriggerBuilder.Create()
16         .WithIdentity("myTrigger2")
17         .ForJob("myJob2")
18         .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(11, 30)) // execute job daily at 11:30
19         .ModifiedByCalendar("myHolidays") // but not on holidays
20         .Build();
21
22     // .. schedule job with trigger2 

关于触发器结构/构建详细信息将会在后面两节课中介绍。现在,只需要相信上面的代码创建了两个触发器对象,每个触发器每天都会被触发。然而,任何发生在日历对象中排除的日期内的触发将会跳过。

可以查阅Quartz.Impl.Calendar 包目录下的几个Calendar实现类,估计有适合你需要的类

时间: 2024-11-03 20:47:03

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

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

第六课 CronTrigger CronTrigger比SimpleTrigger更常用,当你需要一个基于日历般概念的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间. 使用SimpleTrigger,你可以这样指定触发时间表例如“每周五的中午”,或是“每周末的上午9:30”,甚至是“一月份每周一.三.五上午9:00到10:00之间每5分钟”. 虽然如此,跟SimpleTrigger一样,CronTrigger也需要指定startTime让调度器生效,指定endTime让调度器

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

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

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

第三课 更多关于Jobs和JobDetails 在这二课我们已经学习到,Jobs接口非常容易实现,只有一个execute方法.我们需要再学习一些知识去理解jobs的本质,Job接口的execute方法以及JobDetails接口. 当你实现Job接口类,Quartz需要你提供job实例的各种参数,Job接口实现类中的代码才知道如何去完成指定类型Job的具体工作.这个过程是通过JobDetail类来完成的,该类会在下一个章节作简要介绍.        JobDetail的实例是调用JobBuild

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

第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件包括:触发器被触发,触发器触发失败(在触发器课程中讨论过),以及触发器触发完成(触发器完成后作业任务开始运行). 1 public interface ITriggerListener 2 { 3 string Name { get; } 4 5 void TriggerFired(ITrigger

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

第八课 调度监听器 调度监听器和触发监听器和触发监听器.作业任务监听器非常相似,只是调度监听器在调度器内接收通知事件,而不需要关联具体的触发器或作业任务事件. 跟调度监听器相关的事件,添加作业任务/触发器,移除作业任务/触发器,调度器发生严重错误,调度器关闭等. The ISchedulerListener Interface public interface ISchedulerListener { void JobScheduled(Trigger trigger); void JobUns

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

Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架 Quartz 框架 教程(中文版)2.2.x 之第二课 Quartz API,Jobs和Triggers简介 Quartz 框架 教程(中文版)2.2.x 之第三课 更多关于Jobs和JobDetails Quartz 框架 教程(中文版)2.2.x 之第四课 更多关于Triggers Quartz 框架 教程(中文版)2.2.x 之第五课 SimpleTrigger Quartz 框架 教程(中文版)2.2.x

(译)Windsor入门教程---第五部分 添加日志功能

介绍 现在我们已经有了基础的框架了,是时候添加内容了,那么我们首先应该考虑的就是在应用程序中添加日志功能.我们会使用Windsor来配置,在这一部分,你将学习Windsor之外的其他功能. Logging Facility 在上一部分说过,Windsor有很多自带的可选的功能组件,他们扩展了Windsor的即用性.在这一部分,我们将在程序中添加日志功能. Logging Facility提供了一些常用的日志框架比如Log4net.Nlog,以及mvc内置的日志框架Trace.Logging Fa

(译)Windsor入门教程---第三部分 编写第一个Installer

简介 在第二部分我们创建了控制器工厂.现在我们要把我们的控制器交给Windsor来管理. Installer Windsor有一个专门的类installer.cs,用来向容器注册组件.在你的应用程序中至少会有几个这样的installer类,所以要保持他们的代码整洁以及可见性.接下来在我们的应用程序中新建一个专门的文件夹"Installer"来存放这些类.我们首先要注册到容器中的就是控制器,所以我们先来新建一个ControllersInstaller.cs类. Controller in

Java - Struts框架教程 Hibernate框架教程 Spring框架入门教程(新版) sping mvc spring boot spring cloud Mybatis

https://www.zhihu.com/question/21142149 http://how2j.cn/k/hibernate/hibernate-tutorial/31.html?tid=63 https://www.zhihu.com/question/29444491/answer/146457757 1. Java - Struts框架教程Struts 是Apache软件基金会(ASF)赞助的一个开源项目.通过采用JavaServlet/JSP技术,实现了基于Java EEWeb