SpringBoot开启定时任务以及cron表达式介绍

导语

在日常开发中,可能会遇到定义一些定时任务,如果使用的是SpringBoot框架的话,开启定时任务是非常简单的,下面就具体讲一下操作步骤。

1,启动类上添加注解

在启动类上面加上注解 @EnableScheduling,开启定时任务。

//开启定时任务
@EnableScheduling
@SpringBootApplication
public class SpringBootTimerTasksApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootTimerTasksApplication.class, args);
    }
}

2,创建定时任务

定义定义任务非常简单,只需要在需要定时执行的方法上加注解 @Scheduled 即可,用来表明该方法是一个定时调度任务。

@Component
public class TestTask {
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
    // 定义每过3秒执行任务
    @Scheduled(fixedRate = 3000)
    public void reportCurrentTime() {
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }
}

启动后,控制台每隔三秒打印结果:

现在时间:18:33:32
现在时间:18:33:35
现在时间:18:33:38

3,Cron表达式

除了上面那种形式外,在 @Scheduled 参数括号中,可以使用 cron 表达式。

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。

按顺序依次为

  • 秒(0~59)
  • 分钟(0~59)
  • 小时(0~23)
  • 天(月)(0~31,但是你需要考虑使用月的天数)
  • 月(0~11)
  • 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
  • 年份(1970-2099)——@Scheduled是不支持的,spring quartz支持

其中每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置。

下面列出一些常用的 cron表达式 :

"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 15 10 * * ? 2005"	2005年的每天上午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触发
"0 15 10 ? * 6L 2002-2005" 	2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3" 		每月的第三个星期五上午10:15触发

用表格表示为:

字段

允许值

允许的特殊字符


0 - 59

, - * /


0 - 59

, - * /

小时

0 - 23

, - * /

日期

1 - 31

, - * ? / L W C

月份

1-12 或者 JAN-DEC

, - * /

星期

1-7 或者 SUN-SAT

, - * ? / L C #

年份(可选)

留空, 1970-2099

, - * /

下面看个具体实例:

//    每3个小时启动
@Scheduled(cron = "0 0 12-20/3 * * ?")
public void timerToNow(){
    String str="定时执行任务的:" + 
        new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
    System.out.println(str);
}

上面实例表示:12点到20点,每隔三个小时执行一次。

小结

本篇文章简单介绍了SpringBoot开启定时任务,由于纯手打,难免会有纰漏,如果发现错误的地方,请第一时间告诉我,这将是我进步的一个很重要的环节。