SpringBoot定时任务小Demo,及Scheduled相关
前言
在实际开发中,定时任务是很常见的功能,那么在SpringBoot是如何实现定时任务的呢?使用起来难不难呢?还需要不要引入格外的架包呢?想必在写定时任务之前,心中肯定存在这些疑惑,现在就来一一说明。
SpringBoot内置了定时任务Scheduled,通过@Scheduled注解就能实现定时任务;当然,还需要在启动类上增加@EnableScheduling来启动定时任务。是的,在SpringBoot里面实现定时任务就是如此简单!下面就看个Demo吧。
首先,在启动类上增加@EnableScheduling注解,来启动定时任务。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
/**
* 添加@EnableScheduling注解启动定时任务
* @author 程就人生
* @date 2020年4月28日
*/
@SpringBootApplication
@EnableScheduling
public class SpringbootQuartzDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootQuartzDemoApplication.class, args);
}
}
第二,开始编写定时任务类,在方法上添加注解或表达式说明定时执行时间;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* 定时任务执行
* @author 程就人生
* @date 2020年4月28日
*/
@Component
public class ScheduledTask {
/**
* corn表达式
* 0/1 * * * * ? 一秒执行一次
*/
//@Scheduled(cron = "0/1 * * * * ?") //一秒执行一次
//@Scheduled(cron = "*/5 * * * * ?") //每隔5秒执行一次
@Scheduled(cron = "0 */1 * * * ?") //每隔1分钟执行一次
public void scheduledTask1(){
System.out.println("定时任务1");
}
/**
* initialDelay:启动后多久开始执行,单位时毫秒
* fixedDelay:下次执行时间,fixedDelay等任务进行完了才开始计时
*/
@Scheduled(initialDelay = 1000 * 10,fixedDelay = 1000 * 5)
public void scheduledTask2(){
System.out.println("任务2执行时间:"+System.currentTimeMillis());
System.out.println("定时任务2");
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务2结束时间:"+System.currentTimeMillis());
}
/**
* initialDelay:启动后多久开始执行,单位时毫秒
* fixedRate:下次执行时间,任务开始运行的时候就计时
*/
@Scheduled(initialDelay = 1000 * 10,fixedRate = 1000 * 5)
public void scheduledTask3(){
System.out.println("任务3执行时间:"+System.currentTimeMillis());
System.out.println("定时任务3");
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("任务3结束时间:"+System.currentTimeMillis());
}
}
最后,启动项目,查看运行结果:
定时任务的难点,就在于Cron表达式的配置,弄懂了Cron表达式的规则就不怕看不懂了。
Cron表达式
Cron表达式是一串有规律可循的字符串,每个字段之间用空格隔开,共有5到6个空格,分为6或7个域,每一个域代表一个含义,Cron表达式有两种语法格式:
(1)Seconds Minutes Hours DayofMonth Month DayofWeek Year
(2)Seconds Minutes Hours DayofMonth Month DayofWeek
一、结构
Corn从左到右(用空格隔开):秒 分 小时 月份中的天 月份 星期中的天 年份
二、各字段的含义
字段 | 允许值 | 允许的特殊字符 |
---|---|---|
秒(Seconds) | 0~59的整数 | , - * / |
分(Minutes) | 0~59的整数 | , - * / |
小时(Hours) | 0~23的整数 | , - * / |
日期(DayofMonth) | 1~31的整数 | ,- * ? /LWC |
月份(Month) | 1~12的整数(JAN-DEC) | , - * / |
星期(DayofWeek) | 1~7的整数( SUN-SAT) | , - * ? / LC# |
年(可选,留空)(Year) | 1970~2099 | , - * / |
星期的可选参数:“MON-FRI”,“MON,WED,FRI”,“MON-WED,SAT”等等。
特殊字符的含义
每一个域都可以使用数字,也可以使用特殊字符,特殊字符的含义如下:
*:表示匹配该域的任意值。在Minutes域使用*,即表示每分钟都会触发事件。
?:只能用在DayofMonth和DayofWeek两个域。
-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
/:表示起始时间开始触发,然后每隔固定时间触发一次。在Minutes域使用5/20,则意味着5分钟触发一次。
,:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
三、常用表达式例子
表达式 | 含义 |
---|---|
0 0 2 1 * ? * | 每月1日的两点执行任务; |
0 15 10 ? * MON-FRI | 周一到周五每天上午10:15执行任务; |
0 15 10 ? 6L 2002-2006 | 2002-2006年的每个月的最后一个星期五上午10:15执行任务; |
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触发 ; |
有了这些Cron表达式配置详解,写定时任务是不是简单多了~!
参考资料:
https://blog.csdn.net/qq_27520051/article/details/90581343
https://www.cnblogs.com/javahr/p/8318728.html