1. Trigger
trigger
通过TriggerBuilder
实现。(注意Builder
的链式)
Trigger对象用来告诉调度程序作业什么时候触发。
即触发执行job。
Trigger触发器:执行任务的规则;比如每天,每小时等。
一般情况使用SimpleTrigger
,和CronTrigger
,这个触发器实现了Trigger
接口。
1.对于复杂的时间表达式来说,比如每个月15日上午几点几分,使用CronTrigger
2.对于简单的时间来说,比如每天执行几次,使用SimpleTrigger
/ 1 / 触发器通用属性
1.JobKey
2.StartTime
3.EndTime
- JobKey 触发器触发时,该指定的Job实例运行
- StartTime 触发器首次首发时间(
java.util.Date
) - EndTime 不再被触发的时间(
java.util.Date
)
Scheduler中的部分业务
/*
Scheduler
3s开始执行,6s结束。每隔2s执行一次
相当于3s,5s在执行。然后停止
*/
//2.定义Trigger实例,定义该job立即执行,并且每隔两秒重复执行一次,直到永远
Date d = new Date();
Trigger trigger = TriggerBuilder
.newTrigger()
.withIdentity("mytrigger","group1")
.usingJobData("message","hello mytrigger1")
.usingJobData("DoubleTriggerValue",5.21D)
.startAt(new Date(d.getTime()+3000)) //(1)开始执行
.endAt(new Date(d.getTime()+6000)) //(2)结束执行
.withSchedule(
SimpleScheduleBuilder
.simpleSchedule()
.withIntervalInSeconds(2)
.repeatForever())
.build();
job中的部分业务
/*
job
*/
//jobKey(name和group)
Trigger t = context.getTrigger();
System.out.println("trigger jonKey"+t.getJobKey().getName());
2. SimpleTrigger
- 在指定的时间段内执行一次作业任务
- 在指定的时间间隔内多次执行作业任务
2.1 示例1:4s后执行且只执行1次
直接标明开始时间即可,不给策略就是执行一次
//2.定义Trigger实例
Date d = new Date();
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
.newTrigger()
.withIdentity("mytrigger","group1")
.usingJobData("message","hello mytrigger1")
.usingJobData("DoubleTriggerValue",5.21D)
.startAt(new Date(d.getTime()+4000))
.build();
2.2 示例2:有起止时间,间隔执行
见本节1中的代码即是。
或者稍微修改,指定次数为无限即可(给定具体数字可以)。
//2.定义Trigger实例
Date d = new Date();
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder
.newTrigger()
.withIdentity("mytrigger","group1")
.usingJobData("message","hello mytrigger1")
.usingJobData("DoubleTriggerValue",5.21D)
.startAt(new Date(d.getTime()+4000))
.withSchedule(
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2)
.withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)
)
.build();
3. CronTrigger
- 基于
日历
的作业调度器
,比SimpleTrigger
更常用
//2(1).定义CronTrigger
CronTrigger cronTrigger =TriggerBuilder
.newTrigger()
.withIdentity("myCronTrigger","group1")
.withSchedule(
CronScheduleBuilder.cronSchedule("0/10 * * ? * *")
)
.build();
Cron表达式
- 用于配置
CronTrigger
实例 - 由
7个子表达式
组成的字符串,描述了时间表的详细信息。 - 格式:
[秒] [分] [小时] [日] [月] [周] [年]
cron的表达式被用来配置CronTrigger实例。 cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。这些子表达式是分开的空白,代表:
- Seconds
- Minutes
- Hours
- Day-of-Month
- Month
- Day-of-Week
- Year (可选字段)
例 “0 0 12 ? * WED” 在每星期三下午12:00 执行,
个别子表达式可以包含范围, 例如,在前面的例子里(“WED”)可以替换成 “MON-FRI”, “MON, WED, FRI”甚至”MON-WED,SAT”.
“*” 代表整个时间段.
每一个字段都有一套可以指定有效值,如
Seconds (秒):可以用数字0-59 表示,
Minutes(分):可以用数字0-59 表示,
Hours(时) :可以用数字0-23表示,
Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份
Month(月) :可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
Day-of-Week(每周):可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
“/”:为特别单位,表示为“每”如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行
“?”:表示每月的某一天,或第周的某一天
“L”:用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几如“6L”表示“每月的最后一个星期五”
“W”:表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日”
““#”:是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五”
字段名 | 允许的值 | 允许的特殊字符 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * / |
日 | 1-31 | , - * ? / L W C |
月 | 1-12 or JAN-DEC | , - * / |
周几 | 1-7 or SUN-SAT | , - * ? / L C # |
年 (可选字段) | empty, 1970-2099 | , - * / |
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
参考文献:
- Quartz教程
- Cron表达式的详细用法
- 搜索在线生成工具。