(转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例...
http://blog.csdn.net/zixiao217/article/details/53075009
Quartz的主要接口类是Schedule、Job、Trigger,而触发器Trigger就是定时任务的触发时间,它规定安排了关联的任务会在什么时候执行,并且表明了再次执行的时机。
Quartz提供了多种触发器:
我们详细讲解最常用的两种触发器:简单触发器SimpleTrigger、基于Cron表达式的触发器CronTrigger
(本文章分享在CSDN平台,更多精彩请阅读 东陆之滇的csdn博客:http://blog.csdn.net/zixiao217)
简单触发器SimpleTrigger
SimpleTrigger是接口Trigger的一个具体实现,它可以触发一个已经安排进调度程序(任务执行计划)的任务,并可以指定时间间隔重复执行该任务。
SimpleTrigger 包含几个特点:开始时间、结束时间、重复次数以及重复执行的时间间隔。
重复的次数可以是零,一个正整数,或常量SimpleTrigger.REPEAT_INDEFINITELY
。
重复执行的时间间隔可以是零,或者long类型的数值表示毫秒。值得注意的是,零重复间隔会造成触发器同时发生(或接近同时作为调度管理)。
“结束时间”的属性会重写重复的次数,这可能是有用的,如果你想创建一个触发器,如每10秒触发一次,直到一个给定的时刻,而不是要计算的次数,它会在开始时间和结束时间重复执行。结束时间一到,就算你指定了重复次数很多次(比如执行10W次),但是时间一到它将不再执行。
SimpleTrigger 实例创建依赖于TriggerBuilder 和SimpleScheduleBuilder ,使用Quartz提供的DSL风格创建触发器实例,
首先静态引入builder,引入时间builder——DateBuilder:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.SimpleScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
我们可以创建很多不同形式的触发器:
创建一个指定时间开始执行,但是不重复的触发器
使用startAt(Java.util.Date)
设置触发器的第一次执行时间:
SimpleTrigger trigger = (SimpleTrigger) newTrigger().withIdentity("trigger1", "group1").startAt(myStartTime) // some Date.forJob("job1", "group1") // identify job with name, group strings .build();
创建一个指定时间开始执行,每10s执行一次,共执行10次的触发器
使用SimpleScheduleBuilder的withIntervalInSeconds(N)
方法可以指定间隔N秒就执行一次;withRepeatCount(M)
可以指定执行次数M。
trigger = newTrigger().withIdentity("trigger3", "group1").startAt(myTimeToStartFiring) // if a start time is not given (if this line were omitted), "now" is implied .withSchedule(simpleSchedule() .withIntervalInSeconds(10) .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings .forJob(myJob) // identify job with handle to its JobDetail itself .build();
SimpleScheduleBuilder有很多类似的方法,API如下:
创建一个在未来第五分钟的时候执行一次的触发器
使用DateBuilder的futureDate方法可以指定在未来时间执行。
trigger = (SimpleTrigger) newTrigger().withIdentity("trigger5", "group1").startAt(futureDate(5, IntervalUnit.MINUTE)) .forJob(myJobKey) /* job的jobKey*/ .build();
创建一个马上执行、每个5分钟执行、知道22:00结束执行的触发器
使用TriggerBuilder的startNow()方法立即触发(scheduler调用start时算起,视优先级而定);
withIntervalInMinutes(5)每个5分钟执行一次;
repeatForever()一直重复;
endAt(dateOf(22, 0, 0))知道22:00终结触发器:
trigger = newTrigger().withIdentity("trigger7", "group1").startNow().withSchedule(simpleSchedule() .withIntervalInMinutes(5) .repeatForever()) .endAt(dateOf(22, 0, 0)) .build();
创建一个在偶数小时执行、每两个小时执行一次的触发器
trigger = newTrigger().withIdentity("trigger8") // group未指定,则会使用默认的组名.startAt(evenHourDate(null)) // 在下一个偶数小时开始执行(00:00:00、02:00:00、04:00:00等) .withSchedule(simpleSchedule() .withIntervalInHours(2) //每隔两小时执行一次 .repeatForever()) //一直重复执行 .build();
值得注意的是,如果没有调用startAt(..)方法,默认使用startNow()。
建议花点时间逐个尝试使用TriggerBuilder、SimpleScheduleBuilder 和DateBuilder提供的API方法以加深理解。
关于简单触发器”熄火”的指令
SimpleTrigger 包含一些指令在它”熄火”时可以告知Quartz怎么去处理。这些指令包含在SimpleTrigger 的常量中。
- REPEAT_INDEFINITELY - 用于表示触发器的“重复计数”是不确定的。或者换句话说,触发应该不断重复直到触发的结尾时间戳
- MISFIRE_INSTRUCTION_FIRE_NOW - 如果熄火,该指令会告诉Quartz应该马上再次触发
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT - 如果熄火,该指令会告诉Quartz马上执行并计数累计到已经执行的次数当中去,如果结束时间已经过了,则不会再执行。
- MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT - 如果熄火,会告诉Quartz想要现在就执行一次(即使现在不是它原本计划的触发时间)
- MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT - 如果熄火,会告诉Quartz在下一次执行时间再次开始执行
一个使用”熄火”策略的触发器示例:
trigger = newTrigger().withIdentity("trigger7", "group1").withSchedule(simpleSchedule().withIntervalInMinutes(5) .repeatForever() .withMisfireHandlingInstructionNextWithExistingCount()) .build();
基于Cron表达式的触发器CronTrigger
CronTrigger通常使用得比SimpleTrigger等多一些。特别是基于日历的概念,而不是对具体间隔的行为。
通过CronTrigger,你可以指定”每个星期五的中午”、”每个工作日上午9:30”,甚至是”一月的每星期一的上午9点至10点之间的每5分钟,星期三和星期五”(这长串直接懵逼了…)执行。
Cron表达式
首先了解Cron表达式,它是用于配制CronTrigger实例的。Cron表达式,实际上是由七个子表达式组成的字符串,它描述了不同的调度细节。这些子表达式是用空格分隔的,并表示:
秒
分
时
月中的天
月
周中的天
年(可选项)
例如: “0 0 12 ? * WED” 表示 “个星期三的12点”
单个子表达式可以包含范围和/或列表,例如:
"0 0 7 ? * MON-FRI" 表示 "每个工作日的7点""0 0 19 ? * MON,WED,FRI" 表示 "周一、周三和周五的19点""0 0 14 ? * MON-WED,SAT" 表示 "周一到周三以及周六的14点"
Cron表达式的规则说明
所有字段都有一组可以指定的有效值。
- 数字 0 到 59 可以表示秒和分
- 0到23可以表示小时
- 月中的天可以使用1到31的数值, 但是你要注意该月的天数!
- 月用0 到 11之间的数值表示, 或者使用JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV 和 DEC来表示1-12月
- 一周中的天试用1到7表示 (1 表示 周日) 或者使用 SUN, MON, TUE, WED, THU, FRI 和 SAT
创建CronTrigger
CronTrigger实例使用TriggerBuilder 和 CronScheduleBuilder创建,静态引入:
import static org.quartz.TriggerBuilder.*;
import static org.quartz.CronScheduleBuilder.*;
import static org.quartz.DateBuilder.*:
创建一个8到17点间每两分钟执行一次的Cron触发器:
cronTrigger1 = newTrigger().withIdentity("trigger3", "group1").withSchedule(cronSchedule("0 0/2 8-17 * * ?")) .forJob("myJob", "group1") .build();
创建一个每天10:42执行的Cron触发器:
cronTrigger2 = newTrigger().withIdentity("trigger3", "group1").withSchedule(dailyAtHourAndMinute(10, 42)) .forJob(job.getKey()) .build(); /*或者 *我更喜欢下面这种方式 */ cronTrigger3 = newTrigger() .withIdentity("trigger3", "group1") .withSchedule(cronSchedule("0 42 10 * * ?")) .forJob(job.getKey()) .build();
关于CronTrigger”熄火”的指令
CronTrigger同样包含一些指令在它”熄火”时可以告知Quartz怎么去处理。
- MISFIRE_INSTRUCTION_FIRE_ONCE_NOW - 如果熄火,该指令会告诉Quartz希望马上再次触发
- MISFIRE_INSTRUCTION_DO_NOTHING - 如果熄火,该指令会告诉Quartz下一次执行时间到来时再执行,并不想马上执行
cronTrigger4MisfireInstruction = newTrigger().withIdentity("trigger3", "group1").withSchedule(cronSchedule("0 0/2 8-17 * * ?") .withMisfireHandlingInstructionFireAndProceed()) .forJob("myJob", "group1") .build();
史上最详细的Cron表达式的举例讲解
这里列举很多最常用的Cron表达式例子,拿来即用,使用时注意区别:
0 0 12 * * ? 每天12点执行
0 15 10 ? * * 每天的10:15执行
0 15 10 * * ? 每天的10:15执行
0 15 10 * * ? * 每天的10:15执行
0 15 10 * * ? 2005 2005年每天的10:15执行 0 * 14 * * ? 每天的14:00到14:59期间每分钟执行 0 0/5 14 * * ? 每天的14:00到14:55每隔5分钟执行 0 0/5 14,18 * * ? 每天的14:00到14:55每隔5分钟执行和18:00到18:55每隔5分钟执行 0 0-5 14 * * ? 每天的14:00到14:05执行 0 10,44 14 ? 3 WED 三月的每一个周三的14:10和14:44执行 0 15 10 ? * MON-FRI 工作日每天的10:15:00执行 0 15 10 15 * ? 每个月的第15天的10:15:00执行 0 15 10 L * ? 每个月最后一天的10:15:00执行 0 15 10 ? * 6L 每个月最后一个周五的10:15:00执行 0 15 10 ? * 6L 2002-2005 2002, 2003, 2004, 和2005年每个月最后一个周五的10:15:00执行 0 15 10 ? * 6#3 每个月的第三个周五的10:15:00执行 0 0 12 1/5 * ? 每个月的第一天的12:00:00开始执行,每隔5天间隔执行 0 11 11 11 11 ? 每年的11月11日11:11:00执行
转载于:https://www.cnblogs.com/telwanggs/p/7237914.html
(转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例...相关推荐
- (转)Java任务调度框架Quartz入门教程指南(二) 使用job、trigger、schedule调用定时任务...
http://blog.csdn.net/zixiao217/article/details/53044890 读完第一节,我们已经对Quartz有了一个大体的认识,它可以定时帮我们执行一些处理程序, ...
- (转)Java任务调度框架Quartz入门教程指南(三)任务调度框架Quartz实例详解深入理解Scheduler,Job,Trigger,JobDetail...
http://blog.csdn.net/zixiao217/article/details/53053598 首先给一个简明扼要的理解: Scheduler 调度程序-任务执行计划表,只有安排进执行 ...
- 关于swift5以上的SnapKit框架的入门教程使用
关于swift的SnapKit框架的入门教程使用 苹果在swift框架下面,一般使用snapKit进行纯代码的自动布局.常见的布局方式一种是纯代码,还有VFL,此语法较难,或者相对来说比较麻烦.还有s ...
- 阿里架构师开源《Kotlin入门教程指南》+《高级Kotlin强化实战》
对于有Java基础的程序员来说,Kotlin是一门非常容易上手的编程语言,也是一门必须掌握的编程语言.Java代码在运行前需要编译生成一种特殊的class文件,然后Java虚拟机会识别并解释这些cla ...
- 美团小程序框架mpvue入门教程
美团小程序框架mpvue入门教程 自打写了 美团小程序框架mpvue蹲坑指南, 一发不可收拾,今天趁周末空闲,来写个mpvue(没朋友)的简单入门教程,本教程只针对新手,老鸟勿喷. 另外,我还专门为本 ...
- Quartz入门教程
本文参考文章编写 Quartz 官网 Quartz 是 OpenSymphony 开源组织在 Job Scheduling 领域又一个开源项目,是完全由 Java 开发的一个开源任务日程管理系统,&q ...
- 迷你MVVM框架 avalonjs 入门教程(司徒正美)
迷你MVVM框架 avalonjs 入门教程 关于AvalonJs 开始的例子 扫描 视图模型 数据模型 绑定属性与动态模板 作用域绑定(ms-controller, ms-important) 模板 ...
- vue 美团框架_美团小程序框架mpvue入门教程
美团小程序框架mpvue入门教程 本教程只针对新手,老鸟勿喷. 另外,我还专门为本文做了一个简单的项目,如果懒得从头开始搭项目的童鞋,可以直接去我的 github上克隆到本地, 安装一下依赖,即可直接 ...
- WPF入门教程系列四——Dispatcher介绍
WPF入门教程系列四--Dispatcher介绍 一.Dispatcher介绍 微软在WPF引入了Dispatcher,那么这个Dispatcher的主要作用是什么呢? 不管是WinForm应用程序还 ...
最新文章
- 腾讯布局移动应用商店 总下载量累计达40亿次
- oracle test就死,简单说明Oracle数据库中对死锁的查询及解决方法
- 生成从A到Z这个一个字符序列
- hadoop大数据集群完全分布式部署实操篇:HDFS2.9.2、HBASE2.2.6、YARN2.9.2、SPARK2.4.7,ZOOKEEPER3.6.2
- nginx哪个版本性能好_nginx性能为什么好
- 如何C语言编程二维数组五位学生总分,C语言编程题(有关二维数组的循环的)...
- Pycharm导入MySQL驱动包误区
- 矩阵论(四)——矩阵的广义逆
- linux下实现文件双向同步 unsion,unison做数据双向同步
- ibm tivoli_使用Tivoli®Composite Application Manager监视Tivoli®Access Manager WebSEAL服务器事务以进行响应时间跟踪
- js和jsp的区别和联系
- 大风车吱呀吱悠悠地转
- K-means算法和K临近算法
- 宁波银行总行金融科技部社招招聘火热进行中
- 计算机维修知识题库,职业技能鉴定国家题库统一试卷 中级计算机维修工知识试卷 B卷...
- 有道云笔记突然出现乱码 日记变成乱码
- nrcellcu和nrcelldu_华为5G网管MBB操作指导书
- 串口服务器 无线 802.1n,宇泰 UT-9061 10/100M TCP/IP转RS-232/485/422 WIFI串口服务器
- 完美修复google翻译失效的问题
- 大图片上的像素风格游戏图片分割
热门文章
- 在线内存泄露定位--memleak工具
- 网络协议:HTTPS
- (48)FPGA面试题sram,falsh memory,及dram的区别
- load average多少是正常_从阿里大促中,我理出的CPU与Load异常排查思路
- TCP超时设置的客户端重发5次
- matlab中定点数16位转为14位,如何使用python将浮点数转换为具有预定义位数的固定点...
- CPU的内部物理结构介绍
- 【AD】AD19/20笔记及快捷键
- Java学习日报—Java并发—2021/11/22
- html 动物特效,分享9款用HTML5/CSS3制作的动物人物动画,