15 SpringBoot Task定时任务

目录

推荐一篇优秀文章:

一、开启定时任务

二、@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.启动项目,定时任务方法按照配置定时执行。

二、@Scheduled注解的4个参数

15 SpringBoot Task定时任务_第1张图片

@Scheduled写在方法上方,指定该方法定时执行。常用参数如下:
        cron: cron 表达式,定义方法执行的时间规则。
        fixedDelay:任务立即执行,之后每隔多久执行一次,单位是毫秒,上一次任务结束 后计算下次执行的时间。
// 立即执行,任务结束后每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()));
 }
        fixedRate:任务立即执行,之后每隔多久执行一次,单位是毫秒,上一次任务开始 后计算下次执行的时间。
// 立即执行,从执行开始算时间,之后每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()));
 }
        initialDelay:项目启动后不马上执行定时器,根据 initialDelay的值延时执行。
// 项目启动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()));
 }

三、Cron表达式

15 SpringBoot Task定时任务_第2张图片

1.语法 

Spring Task依靠Cron表达式配置定时规则。Cron表达式是一个字符串,分为67个域,每一个域代表一个含义,以空格隔开。有如下两种语法格式:

1.Seconds Minutes Hours DayofMonth Month DayofWeek Year
1
2.Seconds Minutes Hours DayofMonth Month DayofWeek

注意:一般“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表达式中, , 表示“列出枚举值”

2.举例

含义
表达式
每隔 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

你可能感兴趣的:(SpringBoot,分布式)