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

第六课 CronTrigger

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

使用SimpleTrigger,你可以这样指定触发时间表例如“每周五的中午”,或是“每周末的上午9:30”,甚至是“一月份每周一、三、五上午9:00到10:00之间每5分钟”。

虽然如此,跟SimpleTrigger一样,CronTrigger也需要指定startTime让调度器生效,指定endTime让调度器终止。

Cron表达式

Cron表达式用于配置CronTrigger实例。Cron表达式实际上是由7个子表达式组成的字符串,描述了时间表的详细信息。这些子表达式用空格隔开,分别代表:

1、秒

2、分

3、小时

4、月份中的天数

5、月

6、星期中的天数

7、年(可选)
 一个完整的Cron表达式的字符串例子“0 0 12 ? * WED”,意思是“每周三的上午12:00:00”。

每个了表达式都包含“和”、“或”的两种排列,例如,上一个例子中星期中的天数字段(显示的是“WED”)可以替换为“MON-FRI”,“MON,WED,FRI”,甚至是“MON-WED,SAT”。

通配符(“*”)可用来表示该字段的任意值,因此“*”在上面的例子中的月份字段表示“每个月”,“*”在星期中的天数字段由此明显是表示“一周的任何一天”。

“/”字符可用来表示增量的值。例如,如果你在分钟字段写“0/15”,这表示“每次从一小时中的第0分钟开始,每隔15分钟触发”,如果你在分钟字段上写“3/20”,这表示“每次从一小时中的第3分钟开始,每隔20分钟触发”——换句话说,这跟在分钟字段上指定“3,23,43”是一样的。注意细微的区别:“/35”不是表示“每隔35分钟”,而是表示“每次从一小时中的第0分钟开始,每隔35分钟触发”,相当于指定“0,35”。

“?”字符允许出现在月份中的天数和星期中的天数字段中。它一般用来指定“不关心的值”。当你需要在这两个字段中的一个指定不确定的值是非常方便的,这个字符不能用在其他的字段中。可以查看下面的例子(或是CronTrigger的)获得更详细的说明。

“L”字符允许出现在月份中的天数和星期中的天数字段中。这个字符是“last”的缩写,但是在这两个字段中有不同的含义。例如,“L”字符出现在月份中的天数字段中表示“每月的最后一天”——1月31日,平年的2月28日。如果该字符单独用在星期中的天数字段时,仅仅是表示“7”或是“SAT”。但是在星期中的天数字段中该字符用在其他值的后面,表示“每月的最后一个星期几”——例如“6L”或是“FRIL”都表示“每月的最后一个星期五”。你也可以指定每月最后一天的偏移数,例如“L-3”表示日历月份的最后三天。当你使用“L”字符时,最好不要使用排列值或是带范围的值,否则你会对结果感到意外和难以理解。

“w”字符用来指定给定日期的最近一个工作日(工作日指的是从周一到周五)。例如,如果你在月份中的天数字段的值指定为“15w”,这表示“离每月15号最近的工作日”。

“#”字符用来指定每月的第N个工作日,例如,星期中的天数字段的值为“6#3”或是“FRI#3”表示“每月的第三个星期五”。

下面演示了一些表达式的例子和含义——你可以在org.quartz.CronExpression的找到更多信息。

Cron表达式案例

Cron案例1——仅仅表示每隔5分钟触发一次:

"00/5 * * * ?"

Cron案例2——表示每隔5分钟,在过了10秒后触发一次(例如上午10:00:10,10:05:10等):

"100/5 * * * ?"

Cron案例3——表示每个周三到周五,在上午10:30,11:30,12:30和13:30分触发:

"030 10-13 ? * WED,FRI"

Cron案例4——表示每月从5号到20号,上午8时到10时之间的每半小时触发,注意这个触发器只在8:00,8:30,9:00和9:30分触发,上午10:00不会触发:

"00/30 8-9 5,20 * ?"

注意有些调度需求因太复杂例如“上午9:00到10:00之间的每5分钟,下午1:00到10:00的每20分钟”,而不能用单一的触发器来表示。这种情况的解决方案是创建两个简单的触发器,将它们注册到调度器中去运行同一个作业任务。

构建CronTriggers

CronTrigger实例对象可以使用TriggerBuilder(针对    触发器主要的参数)和CronScheduleBuilder(针对CronTrigger的指定参数)来创建。为了使用这些创建类时满足DSL格式,使用静态导入:

创建一个触发器,每天从上午8点到下午5点,每隔2分钟触发一次:

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger3", "group1")
3     .WithCronSchedule("0 0/2 8-17 * * ?")
4     .ForJob("myJob", "group1")
5     .Build();

创建一个触发器,每天的上午10:42分触发一次:

1 // we use CronScheduleBuilder‘s static helper methods here
2 trigger = TriggerBuilder.Create()
3     .WithIdentity("trigger3", "group1")
4     .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(10, 42))
5     .ForJob(myJobKey)
6     .Build();

或者

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger3", "group1")
3     .WithCronSchedule("0 42 10 * * ?")
4     .ForJob("myJob", "group1")
5     .Build();

CronTrigger触发失败指令

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

CronTrigger的触发失败指令常量

•MisfireInstruction.IgnoreMisfirePolicy
•MisfireInstruction.CronTrigger.DoNothing
•MisfireInstruction.CronTrigger.FireOnceNow
所有的触发器都可以使用Trigger.MISFIRE_INSTRUCTION_SMART_POLICY指令,并且这条指令也是所有触发器的默认指令。

“智能策略”指令可以从CronTrigger的MISFIRE_INSTRUCTION_FIRE_NOW当中获得解释。文档中CronTrigger的updateAfterMisfire方法解释了动态选择行为的更详细的信息。

当你创建CronTrigger时,可以通过CronSchedulerBuilder指令触发失败指令作为调度器的一部分。

1 trigger = TriggerBuilder.Create()
2     .WithIdentity("trigger3", "group1")
3     .WithCronSchedule("0 0/2 8-17 * * ?", x => x
4         .WithMisfireHandlingInstructionFireAndProceed())
5     .ForJob("myJob", "group1")
6     .Build();
时间: 2024-11-10 11:51:57

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

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

第四课 更多关于Triggers 跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数.前面已经提到过,有许多不同类型的触发器供你选择,适用不同的调度需求. 你将会在第五课 Simple Trigger和第六课 Triggers学到这两种常用的触发器类型. 触发器通用属性 所有类型的触发器都有TriggerKey属性去跟踪触发器标识,除了这一个事实之外,还有许多其他的属性,对所有触发器类型都适用.这些通用属性在创建触发器定义时通过T

[译]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 之第五课 SimpleTrigger

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

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

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

Quartz 第六课 CronTrigger(官方文档翻译)

CronTriggers使用的频率比SimpleTrigger跟高.如果需要schedule 中触发Job的方式类似于日历的形式而不是一个确定的是时间间隔,那就需要使用CronTrigger. 对于CronTrigger,你可以触发Schedule,例如每个周五中午或者每个工作日的下午9:30或者在早上9:00至10::之间每五分钟执行一次在每个周一.周二.周五执行. 不紧如此,SampleTrigger和CronTriggerd都有一个启动时间和一个可选的结束时间来停止. Cron Expre

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