Cron表达式是以5个或者6个空格隔开,分成6个或7个域,每个域代表一个时间域。Cron表达式有以下两种语法格式:
1. Seconds Minutes Hours DayofMonth Month DayofWeek Year
2. Seconds Minutes Hours DayofMonth Month DayofWeek
Month取值:
1. 一月:JAN或0
2. 二月:FEB或1
3. 三月:MAR或2
4. 四月:APR或3
5. 五月:MAY或4
6. 六月:JUN或5
7. 七月:JUL或6
8. 八月:AUG或7
9. 九月:SEP或8
10. 十月:OCT或9
11. 十一月:NOV或10
12. 十二月:DEC或11
DayofMonth取值:
1. 数字
2. 表示最后:L
3. 有效工作日(周一至周五):W (系统将在离指定日期最近的有效工作日执行。比如5W,如果5日是工作日,则在当天触发;如果5日是周六,则会延期在周一触发。注意:W不会跨月。比如30W,30号是周六,则不会顺延至下周一来执行)
DayofWeek取值:
1. 周日:SUN或1
2. 周一:MON或2
3. 周二:TUE或3
4. 周三:WED或4
5. 周四:THU或5
6. 周五:FRI或6
7. 周六:SAT或7
8. 表示最后:L
域中符号解释:
1. * :表示匹配任意值。比如在Seconds域中配置为*,则表示每秒执行。(可用于任意域)
2. ?:只能用在 DayofMonth和DayofWeek,表示匹配该域的任意值。
3. -:表示范围。例如:在Seconds域中配置2-10,则表示从2到10秒内,每秒执行。
4. /:表示从起始开始触发,然后每个固定时间执行一次。比如在Seconds域中配置5/20,则表示在第5秒开始执行,然后每过20秒执行一次(以每一分钟为周期)。
5. ,:表示枚举值。例如在Seconds域中配置5,20,25,则表示在第5秒、20秒和25秒执行。
6. L:只能用在 DayofMonth和DayofWeek,表示每周或者每月的最后一天。如果DayofWeek域配置5L则表示最后一个星期的周四执行。
7. W:只能用在DayofMonth域,
//初始化带cron表达式的调度器:
SchedulerFactory sf =new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
//指定调度器执行的类
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1","group1")
.build();
//创建一个cron表达式的触发器
CronTrigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
// .withSchedule(cronSchedule("1,2,3,40,50 * * * * ?")) //每分钟的第1,2,3,40,50秒执行
// .withSchedule(cronSchedule("1-30 * * * * ?")) // 在1-30中的每秒执行
// .withSchedule(cronSchedule("* * * * * ?")) // 每秒执行
// .withSchedule(cronSchedule("5/20 * * * * ?")) // 从第5秒开始执行后,每过20秒执行一次(一分钟内)。分别在5,25,45秒执行
// .withSchedule(cronSchedule("50 19 * * * ?")) // 每个小时的第19分钟50秒执行
// .withSchedule(cronSchedule("0 0/10 * * * ?")) // 每10分钟执行一次
// .withSchedule(cronSchedule("0 30 0/1 * * ?")) // 每小时的第30分钟执行
// .withSchedule(cronSchedule("0 38 15 * * ?")) // 每日的15:38分钟执行
// .withSchedule(cronSchedule("0 45 15 ? * MON-FRI")) // 每周周一至周五的15:45分执行
// .withSchedule(cronSchedule("0 47 15 ? * FRI")) // 每周五的15:47分执行
// .withSchedule(cronSchedule("0 50 15 ? * 6,7")) // 每周的周五和周六的15:47分执行
// .withSchedule(cronSchedule("0 31 16 6 6 ? *")) //每年的6月6号的16:31分执行
// .withSchedule(cronSchedule("0 33 16 6 * ?")) //每月的6号16:33分执行
// .withSchedule(cronSchedule("0 33 16 6 1,8 ?")) //每年第1月、8月 6号16:33执行
.withSchedule(cronSchedule("0 35 16 8 1 ?")) //每年第1月8号16:35执行
.build();
//将执行类与触发器设置进定时器中
scheduler.scheduleJob(job,trigger);
//启动定时器
scheduler.start();
"1 * * * *?" //表示每分钟的第1秒执行
"1,2,3,40,50 * ** * ?" //表示每分钟的第1、2、3、40、50秒执行
"1-30 * * * *?" //在1-30中每秒执行
"* * * * *?" //每秒循环
"5/20 * * * *?" // 从第5秒开始执行后,每过20秒执行一次(一分钟内)。分别在5,25,45秒执行
"50 19 * * *?" //每个小时的19分50秒执行
"0 0/10 * * *?" // 每10分钟执行一次
"0 30 0/1 * *?" // 每小时的第30分钟执行
"0 38 15 * *?" // 每日的15:38分钟执行
"0 45 15 ? *MON-FRI" // 每周周一至周五的15:45分钟执行。注意:此时的DayofMonth域必须为?
"0 50 15 ? *6,7" // 每周的周五和周六的15:47分执行
"0 31 16 6 6 ?*" //每年的6月6号的16:31分执行
"0 33 16 6 *?" //每月的6号16:33分执行
"0 33 16 6 1,8?" //每年第1月、8月 6号16:33执行