【SpringBoot】定时任务与Cron表达式

SpringBoot定时器

SpringBoot自带定时器功能,若不考虑重复启动定时任务以及并发带来的问题,可以选择这种方式来简单快速地定义定时器。

使用时只需要在声明定时任务的类或者启动类上添加注解@EnableScheduling配合使用在方法上的@Scheduled注解就能简单定义一个定时任务

在启动类上加@EnableScheduling可以方便对所有任务进行开启和关闭

在声明定时任务的类上需要加@Component将该类实例化到Spring容器中,才能被扫描到类里的定时任务。

在方法上添加@Scheduled注解添加参数设置定时策略,有两种设置方式

1.fixedRate

这种方式适合不指定特定时间,间歇一段时间就执行一次的情况,功能较弱。

2.cron表达式

可以指定什么时候触发、多久触发一次等,功能较强大,需要使用特定的表达式。


两种方式使用如下:

@Component
@Slf4j
public class MyScheduledTask {

    @Scheduled(fixedRate = 1000 * 5)
    public void bootSchedule(){
        log.info("SpringBoot自带定时器fixedRate5s启动:{}",LocalDateTime.now());
    }

    @Scheduled(cron = "10/10 * * * * ?")
    public void bootScheduleCron(){
        log.info("SpringBoot自带Cron定时器fixedRate10s启动:{}", LocalDateTime.now().toString());
    }
}
  • 上面的方法表示每5秒该任务会执行一次
  • 下面的方法则表示任务会从每分钟的第10秒开始,每10秒执行一次

运行效果如下

为什么上面的5条中,5秒运行一次的任务连续执行了4次而10秒的任务没有运行呢?
原因是,当50秒时,运行10秒后进入到下一分钟的范围,而该任务指定从每分钟的第10秒开始运行,所以这次不会调用该任务。

Cron表达式介绍

cron表达式有6或7个域,中间以逗号分隔,理解也比较简单,每个域顺序表示的意义如下

  • 每个符号的含义

注意:每周的第一天是周日


情景测试,我想让一个任务在2019到2020年每月的第3个周三的晚上6点的第20分开始,每5分钟的第30秒执行一次

30 20/5 18 ? * 4#3 2019-2020