第六课 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分钟触发一次:

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

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

 // we use CronScheduleBuilder's static helper methods here
trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(, ))
.ForJob(myJobKey)
.Build();

或者

 trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 42 10 * * ?")
.ForJob("myJob", "group1")
.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指令触发失败指令作为调度器的一部分。

 trigger = TriggerBuilder.Create()
.WithIdentity("trigger3", "group1")
.WithCronSchedule("0 0/2 8-17 * * ?", x => x
.WithMisfireHandlingInstructionFireAndProceed())
.ForJob("myJob", "group1")
.Build();

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

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

    第四课 更多关于Triggers 跟作业任务类似,触发器也非常容易使用,但是在你能够充分掌握Quartz之前,你需要知道并理解许多触发器的客户化的参数.前面已经提到过,有许多不同类型的触发器供你选择, ...

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

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

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

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

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

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

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

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

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

    CronTriggers使用的频率比SimpleTrigger跟高.如果需要schedule 中触发Job的方式类似于日历的形式而不是一个确定的是时间间隔,那就需要使用CronTrigger. 对于C ...

  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. web国际化,在不同的浏览环境,显示不同的语言

    所谓国际化就是支持多种语言,web应用在不同的浏览环境中可以显示出不同的语言.假设我们正在开发一个支持多国语言的Web应用程序,要求系统能够根据客户端的系统的语言类型返回对应的界面:英文的操作系统返回 ...

  2. CAS (1) —— Mac下配置CAS到Tomcat(服务端)

    CAS (1) -- Mac下配置CAS到Tomcat(服务端) tomcat版本: tomcat-8.0.29 jdk版本: jdk1.8.0_65 cas版本: cas4.1.2 cas-clie ...

  3. Beta阶段团队项目开发篇章4

    例会时间 2016.12.11 例会照片 个人工作 上阶段任务验收 删除robot功能较为简单,基本实现,但是一直Question版块任务量过大,考虑到最近要进行编译课设第二次测试,为该任务再分配一段 ...

  4. 个人阅读&个人总结

    个人阅读作业+总结 助教推荐的那些文章都是软件工程上的经典文章,阅读后感受到软件工程本身的深度,之前学习的软件工程都只是皮毛之中的皮毛而已.随着软件规模的越来越庞大,软件工程已经成为了软件开发中的必备 ...

  5. Beta阶段——第一篇 Scrum 冲刺博客

    i. 提供当天站立式会议照片一张: ii. 每个人的工作 (有work item 的ID) (1) 昨天已完成的工作: 数据存储方式改本地存储为数据库存储. (2) 今天计划完成的工作: 账单和剩余舍 ...

  6. UDJC用户自定义Java类

    private RowSet t1 = null;//业务表步骤 private RowSet t2 = null;//删除步骤 public boolean processRow(StepMetaI ...

  7. HTTP压力测试工具wrk的安装及测试

    本次在VMware虚拟机的CentOS6.3系统中进行安装wrk压测工具,具体如下: 一.预先安装需求项 为了安装顺利,不受权限的限制,首先可以把用户切换为root用户# su + 输入root用户对 ...

  8. linux ls文件颜色和底色设置

    转帖 :linux ls文件颜色和底色设置 白色:表示普通文件蓝色:表示目录绿色:表示可执行文件红色:表示压缩文件浅蓝色:链接文件红色闪烁:表示链接的文件有问题黄色:表示设备文件灰色:表示其他文件 这 ...

  9. angular 神坑 ,回调函数无法被监视

    原方法,使用一个confirm 点ok然后回调,结果 界面无法刷新,搜索了下 是因为$scope没有监视model,必须使用apply方法 $scope.SelectedRow=row; negAle ...

  10. 小试javascript模版mustache

    夜以深,人未眠,本该入睡,然逢周末,无聊甚哉,故于此作文打发时间----------- 前几日,无聊,小试了下javascript版本的mustache模版,说是小试,其实主要目的是阅读学习其源码.如 ...