点击上面 免费订阅本账号!
本公众号主要推送javaweb开发相关技术,基础知识点,同时会深入剖析复杂的问题,分享一些优秀的框架,大型项目经验,当今最流行的Javaweb技术,热点科技新闻,招聘信息,生活乐趣等等。点击上方的蓝字,这样您每天可以看到更多的java知识和资讯!完全是免费订阅,请放心关注
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)设置触发器的第一次执行时间:
12345 | 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
执行
点击阅读全文查看 “Java三大主流框架概述“
有人用微信聊天,有人却在微信中学习,成长。下面是2016最HOT IT公众号,赶快试试新的关注方法吧!
关注方式
★长按二维码,选择“识别图中二维码”进行关注。