1、SpringBoot中内置了@Scheduled的定时任务,首先配置这个注解,我还是基于此前创建的demo01项目,找到项目的入口方法Demo01Application添加注解@EnableScheduling

SpringBoot使用@Scheduled创建定时任务_Spring Boot

2、新建一个class文件,添加注解@Component,表明该class会被实例化为Spring bean,被Spring管理。

(1)fixedRate属性:

该属性的含义是上一个该方法调用开始后再次调用的间隔时间,没有等待上一次方法调用完成,

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * 通过控制台打印信息可得出结论:该方法并不会等待该方法已经执行完成,会一直间隔2秒重复调用
     * */
    @Scheduled(fixedRate = 1000)//配置的间隔时间是1秒
    public void fixedRate() throws Exception{
        System.out.println("current time0: " + dateFormat.format(new Date()));
        Thread.sleep(2000);//休眠2秒
        System.out.println("current time1: " + dateFormat.format(new Date()));
    }
}

SpringBoot使用@Scheduled创建定时任务_Spring Boot_02

(2)fixedDelay属性

该属性与上面的fixedRate属性则是相反的,含义为等到该方法执行完成后(延迟配置的时间)再次执行该方法。

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    /**
     * 通过控制台打印信息可得出结论:该方法会等待该方法执行完成,间隔1秒再次调用
     * */
    @Scheduled(fixedDelay=1000)
    public void fixedDelay() throws Exception{
        Thread.sleep(5000);//休眠5秒
        System.out.println("current time2: " + dateFormat.format(new Date()));
    }
}

SpringBoot使用@Scheduled创建定时任务_Spring Boot_03

(3)initialDelay属性

该属性的作用是第一次执行该方法前的延迟时间,而后再执行该方法不再影响

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");


    /**
     * 通过控制台打印信息可得出结论:第一次调用前延迟10秒,而后间隔1秒并等待该方法执行完成再次调用
     * */
    @Scheduled(initialDelay=10000,fixedDelay=1000)
    public void initialDelay() throws Exception{
        System.out.println("current time2: " + dateFormat.format(new Date()));
    }
}

SpringBoot使用@Scheduled创建定时任务_Spring Boot_04

4、cron属性

这是一个时间表达式,通过简单的表达式就能完成实际工作中各种时间的配置

Cron表达式是一个字符串,字符串以5或6个空格隔开,分开工6或7个域,每一个域代表一个含义,Cron有如下两种语法 
格式: 
Seconds Minutes Hours DayofMonth Month DayofWeek Year 或 
Seconds Minutes Hours DayofMonth Month DayofWeek 

{秒} {分} {时} {日} {月} {周} {年(可选)}

表达式举例:

"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触发

在线Cron表达式生成器链接:http://cron.qqe2.com/

@Component
public class TimedTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(cron = "*/20 * * * * ?")//每20秒执行一次
    public void cronCurrentTime() {
        System.out.println("current time3: " + dateFormat.format(new Date()));
    }

}

SpringBoot使用@Scheduled创建定时任务_Spring Boot_05