在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务
1. Spring Boot 使用定时任务@Scheduled-fixedRate方式
1.1 创建定时任务
- pom 配置(只需要引入 Spring Boot Starter jar包即可,Spring Boot Starter 包中已经内置了定时的方法。)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
- 在Spring Boot的主类中加入 @EnableScheduling 注解,启用定时任务的配置
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SpringbootSchedulingApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootSchedulingApplication.class, args);
}
}
- 创建定时任务实现类
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SchedulerTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(fixedRate = 5000)
private void processFixedRate(){
System.out.println("processFixedRate方式:定时任务开始运行,现在时间:" + dateFormat.format(new Date()));
}
}
- 运行程序,控制台中可以看到类似如下输出,定时任务开始正常运作了。
processFixedRate方式:定时任务开始运行,现在时间:10:58:11
processFixedRate方式:定时任务开始运行,现在时间:10:58:16
processFixedRate方式:定时任务开始运行,现在时间:10:58:21
processFixedRate方式:定时任务开始运行,现在时间:10:58:26
processFixedRate方式:定时任务开始运行,现在时间:10:58:31
1.2 参数说明
在上面的入门例子中,使用了 @Scheduled(fixedRate = 5000) 注解来定义每过5秒执行的任务,对于 @Scheduled 的使用可以总结如下几种方式:
- @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
- @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
- @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
2. Spring Boot 使用定时任务@Scheduled-cron 方式
2.1 修改 SchedulerTask
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class SchedulerTask {
private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");
@Scheduled(cron="*/5 * * * * ?")
private void processCron(){
System.out.println("processCron方式:定时任务开始运行,现在时间:" + dateFormat.format(new Date()));
}
}
- 运行程序,控制台中可以看到类似如下输出,定时任务开始正常运作了
processCron方式:定时任务开始运行,现在时间:11:11:30
processCron方式:定时任务开始运行,现在时间:11:11:35
processCron方式:定时任务开始运行,现在时间:11:11:40
processCron方式:定时任务开始运行,现在时间:11:11:45
processCron方式:定时任务开始运行,现在时间:11:11:50
2.2 参数说明
注:不会写cron表达式的小伙伴可百度 在线cron生成器 /手动狗头
cron 一共有七位,最后一位是年,Spring Boot 定时方案中只需要设置六位即可:
第一位,表示秒,取值 0 ~ 59;
第二位,表示分,取值 0 ~ 59;
第三位,表示小时,取值 0 ~ 23;
第四位,日期天/日,取值 1 ~31;
第五位,日期月份,取值 1~12;
第六位,星期,取值 1 ~ 7,星期一,星期二...,注,1 表示星期 天,2 表示星期一;
第七位,年份,可以留空,取值 1970 ~ 2099。
cron 中,还有一些特殊的符号,含义如下:
(*)星号,可以理解为每的意思,每秒、每分、每天、每月、每年...。
(?)问号,问号只能出现在日期和星期这两个位置,表示这个位置的值不确定。
(-)减号,表达一个范围,如在小时字段中使用“10 ~ 12”,则表示从 10 到 12 点,即 10、11、12。
(,)逗号,表达一个列表值,如在星期字段中使用“1、2、4”,则表示星期一、星期二、星期四。
(/)斜杠,如 x/y,x 是开始值,y 是步⻓长,比如在第一位(秒),0/15 就是从 0 秒开始,每隔 15 秒执 行一次。
下面列举几个常用的例子。
(1)0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作业
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 * * ? 每天中午12点触发
(8)0 15 10 ? * * 每天上午10:15触发
(9)0 15 10 * * ? 每天上午10:15触发
(10)0 15 10 * * ? * 每天上午10:15触发
(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发