目录
推荐一篇优秀文章:
一、开启定时任务
二、@Scheduled注解的4个参数
三、Cron表达式
1.语法
2.举例
推荐一篇优秀文章:
Spring Task定时任务 - 苏澜 - 博客园 (cnblogs.com)
1.在启动类开启定时任务,添加@EnableScheduling注解
@SpringBootApplication
@EnableScheduling//开启定时任务
public class Springbootdemo8Application {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo8Application.class, args);
}
}
2.在需要定时任务的方法上加上@Scheduled注解
@Component
public class MyTask {
// 定时任务方法,每秒执行一次
@Scheduled(cron="* * * * * *")
public void task1() {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
System.out.println(sdf.format(new Date()));
}
}
3.启动项目,定时任务方法按照配置定时执行。
// 立即执行,任务结束后每5秒执行一次
@Scheduled(fixedDelay=5000)
public void task1() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
// 立即执行,从执行开始算时间,之后每5秒执行一次
@Scheduled(fixedRate=5000)
public void task2() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
// 项目启动3秒后执行,之后每5秒执行一次。
@Scheduled(fixedRate=5000,initialDelay = 3000)
public void task3() throws InterruptedException {
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Thread.sleep(1000);
System.out.println(sdf.format(new Date()));
}
Spring Task依靠Cron表达式配置定时规则。Cron表达式是一个字符串,分为6或7个域,每一个域代表一个含义,以空格隔开。有如下两种语法格式:
注意:一般“year”年的话,很少使用,因为很少有方法是一两年几年执行一次的。
Seconds(秒):域中可出现 , - * / 四个字符,以及0-59的整数* :表示匹配该域的任意值,在 Seconds 域使用 * ,表示每秒钟都会触发, :表示列出枚举值。在 Seconds 域使用 5,20 ,表示在 5 秒和 20 秒各触发一次。- :表示范围。在 Seconds 域使用 5 - 20 ,表示从 5 秒到 20 秒每秒触发一次/ :表示起始时间开始触发,然后每隔固定时间触发一次。在 Seconds 域使用 5/20 , 表示 5 秒触发一次,25 秒, 45 秒分别触发一次。
Minutes(分):域中可出现 , - * / 四个字符,以及0-59的整数
Hours(时):域中可出现 , - * / 四个字符,以及0-23的整数
DayofMonth(日期):域中可出现 , - * / ? L W C 八个字符,以及1-31的整数C :表示和当前日期相关联。在 DayofMonth 域使用 5C ,表示在5 日后的那一天触发,且每月的那天都会触发。比如当前是10 号,那么每月 15 号都会触发。L :表示最后,在 DayofMonth 域使用 L ,表示每个月的最后一天触发。W :表示工作日,在 DayofMonth 域用 15W ,表示最接近这个月第15 天的工作日触发,如果 15 号是周六,则在 14 号即周五触发;如果15 号是周日,则在 16 号即周一触发;如果15号是周二则在当天触发。注意:1.该用法只会在当前月计算,不会到下月触发。比如在DayofMonth 域用 31W , 31 号是周日,那么会在29 号触发而不是下月 1 号。2.在DayofMonth 域用 LW ,表示这个月的最后一个工作日触发。
Month(月份):域中可出现 , - * / 四个字符,以及1-12的整数或JAN-DEC的单词缩写
DayofWeek(星期):可出现 , - * / ? L # C 八个字符,以及1-7的整数或SUN-SAT 单词缩写,1代表星期天,7代表星期六C :在 DayofWeek 域使用 2C ,表示在 2 日后的那一天触发,且每周的那天都会触发。比如当前是周一,那么每周三都会触发。L :在 DayofWeek 域使用 L ,表示在一周的最后一天即星期六触发。在 DayofWeek 域使用 5L ,表示在一个月的最后一个星期四触发。# :用来指定具体的周数, # 前面代表星期几, # 后面代表一个月的第几周,比如 5#3 表示一个月第三周的星期四。? :在无法确定是具体哪一天时使用,用于 DayofMonth 和 DayofWeek 域。例如在每月的 20日零点触发1 次,此时无法确定 20 日是星期几,写法如下: 0 0 0 20 * ? ;或者在每月的最后一个周日触发,此时无法确定该日期是几号,写法如下: 0 0 0 ? * 1
Year(年份):域中可出现 , - * / 四个字符,以及1970~2099的整数。该域可以省略,表示每年都触发。
1.在Cron表达式中, * 表示“匹配该域的任意值 ”
2.在Cron表达式中, , 表示“列出枚举值”
含义
|
表达式
|
每隔 5 分钟触发一次
|
0 0/5 * * * *
|
每小时触发一次
|
0 0 * * * *
|
每天的 7 点 30 分触发
|
0 30 7 * * *
|
周一到周五的早上 6 点 30 分触发
|
0 30 7 ? * 2-6
|
每月最后一天早上 10 点触发
|
0 0 10 L * ?
|
每月最后一个工作日的 18 点 30 分触发
|
0 30 18 LW * ?
|
2030 年 8 月每个星期六和星期日早上 10 点触发
|
0 0 10 ? 8 1,7 2030
|
每天 10 点、 12 点、 14 点触发
|
0 0 10,12,14 * * *
|
朝九晚五工作时间内每半小时触发一次
|
0 0 0/30 9-17 ? * 2-6
|