1、SpringBoot中内置了@Scheduled的定时任务,首先配置这个注解,我还是基于此前创建的demo01项目,找到项目的入口方法Demo01Application添加注解@EnableScheduling
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()));
}
}
(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()));
}
}
(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()));
}
}
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()));
}
}