学习目标:
SpringBoot
学习内容:
SpringBoot定时任务
什么是SpringBoot定时任务?
项目中需要一个可以动态新增定时定时任务的功能,现在项目中使用的是xxl-job定时任务调度系统,但是经过一番对xxl-job功能的了解,发现xxl-job对项目动态新增定时任务,动态删除定时任务的支持并不是那么好,所以需要自己手动实现一个定时任务的功能
语法
seconds ,minutes, hours ,daysOfMonth ,months ,daysOfWeek ,Cron表达式解析类:org.springframework.scheduling.support.CronSequenceGenerator
pattern每隔域说明
字段名含义 允许的值允许的特殊字符
seconds | 秒 | 0-59 | , - * / |
minutes | 分 | 0-59 | , - * / |
hours | ⼩时 | 0-23 | , - * / |
daysOFMonth | 日 | 1-31 | , - * ? / L W C |
months | 月 | 1-12 or JAN-DEC | , - * / |
daysOfWeek | 周 | 1-7 or SUN-SAT | , - * ? / L C # |
特殊字符说明
*:可⽤在所有字段中,表⽰对应时间域的每⼀个时刻,例如,*在分钟字段时,表⽰“每分钟”
/:可⽤在所有字段中,表⽰对应时间域的每⼀个时刻,例如,*在分钟字段时,表⽰“每分钟”;
x/y表达⼀个等步长序列,x为起始值,y为增量步长值。
如在分钟字段中使⽤0/15,则表⽰为0,15,30和45秒,⽽5/15在分钟字段中表⽰5,20,35,50,你也可以使⽤*/y,它等同于0/y;
?:只能⽤在DayofMonth和DayofWeek两个域。
它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。
例如想在每⽉的20⽇触发调度,不管20⽇到底是星期⼏,则只能使⽤如下写法: 13 13 15 20 * ?, 其中最后⼀位只能⽤?
⽽不能使⽤*,如果使⽤*表⽰不管星期⼏都会触发,实际上并不是这样
-:表达⼀个范围,如在⼩时字段中使⽤“10-12”,则表⽰从10到12点,即10,11,12;
,:表达⼀个列表值,如在星期字段中使⽤“MON,WED,FRI”,则表⽰星期⼀,星期三和星期五;
L:该字符只在⽇期和星期字段中使⽤,代表“Last”的意思,但它在两个字段中意思不同。
L在⽇期字段中,表⽰这个⽉份的最后⼀天,如⼀⽉的31号,⾮闰年⼆⽉的28号;如果L⽤在星期中,则表⽰星期六,等同于7。
但是,如果L出现在星期字段⾥,⽽且在前⾯有⼀个数值 X,则表⽰“这个⽉的最后X天”,例如,6L表⽰该⽉的最后星期五;
W: 该字符只能出现在⽇期字段⾥,是对前导⽇期的修饰,表⽰离该⽇期最近的⼯作⽇。
例如15W表⽰离该⽉15号最近的⼯作⽇,如果该⽉15号是星期六,则匹配14号星期五;如果15⽇是星期⽇,则匹配16号星期⼀;
如果15号是星期⼆,那结果就是15号星期⼆。但必须注意关联的匹配⽇期不能够跨⽉,如你指定1W,如果1号是星期六,结果匹
配的是3号星期⼀,
⽽⾮上个⽉最后的那天。W字符串只能指定单⼀⽇期,⽽不能指定⽇期范围;
LW组合:在⽇期字段可以组合使⽤LW,它的意思是当⽉的最后⼀个⼯作⽇;
#:该字符只能在星期字段中使⽤,表⽰当⽉某个⼯作⽇。
如6#3表⽰当⽉的第三个星期五(6表⽰星期五,#3表⽰当前的第三个),⽽4#5表⽰当⽉的第五个星期三,假设当⽉没有第五个星期
C:该字符只在⽇期和星期字段中使⽤,代表“Calendar”的意思。
使⽤案例:
@Configuration
@EnableScheduling
@Async
public class TimeConfig {
@Scheduled(cron = "15/5 * * * * ?")//写入执行时间
public void test1(){
System.out.println("test1----");
}
}
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五⼯作时间内每半⼩时
0 0 12 ? * WED 表⽰每个星期三中午12点
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3 WED" 每年三⽉的星期三的下午2:10和2:44触发
"0 15 10 ? * MON-FRI" 周⼀⾄周五的上午10:15触发
"0 15 10 15 * ?" 每⽉15⽇上午10:15触发
"0 15 10 L * ?" 每⽉最后⼀⽇的上午10:15触发
"0 15 10 ? * 6L" 每⽉的最后⼀个星期五上午10:15触发
"30 * * * * ?" 程序启动以后的每分钟的第三十秒执行一次
"30 10 * * * ?" 程序启动以后每小时的第10分钟30秒执行一次
"30 10 1 * * ?" 程序启动以后每天的1:10:30一次
"30 10 1 20 * ?" 程序启动以后每月20日 1:10:30 执行一次
"30 10 1 20 10 ? " 每年10月20日 1:10:30 秒执行
"30 10 1 ? 10 * " 10月每日 1:10:30 执行一次
"30 10 1 ? 10 SUN" 10月每周日 1:10:30
"15,30,45 * * * * * " 第15,30,45秒执行
"15-45 * * * * ?" 程序启动后每分钟15到45秒 执行一次
"15/5 * * * * ?" 程序启动5秒后 每到15秒执行一次
"15-30/5 * * * * ?"
"0 0/3 * * * ?"
"0 15 10 ? * MON-FRI"
"0 15 10 L * ?" 每月最后一天的10:15:0 秒执行一次
"0 15 10 LW * ?" 每月的最后一个工作日 0:15:0 秒执行一次
"0 15 10 ? * 5L" 每月最后一个周4 10:15:00
"0 15 10 ? * 5#3" 每月的第三个星期4 10:15:0 执行一次