Spring Boot 定时任务的实现方法
在 Spring Boot 中实现定时任务是一件相对简单的事情。Spring Boot 提供了一个非常方便的接口来实现定时任务,只需要在需要定时执行的函数前加上 @Scheduled 注解,就可以将其转换为一个定时任务。
我们需要在项目的启动文件里配置上 @EnableScheduling 注解,以告诉项目我们是支持定时任务的。例如:
```java
@SpringBootAppliction
@EnableScheduling
public class LotteryApplication {
public static void main(String[] args) {
SpringApplication.run(LotteryApplication.class, args);
}
}
```
在需要定时执行的函数前添加 @Scheduled 注解,例如:
```java
@Component
public class ScheduledTask {
@Scheduled(fixedRate = 5000)
public void scheduledTask() {
// do sth...
}
}
```
这里的 fixedRate = 5000 表示该函数将每 5000 毫秒执行一次。
Scheduled 中支持四个参数:fixRate、fixDelay、cron、initialDelay。
fixRate 和 fixDelay 参数都指定了函数每隔某个毫秒数执行一次,但是它们之间也有细小的差别。fixRate 的计时是相对于系统时间的,也就是一定相隔会固定时间执行。fixDelay 的计时是相对于上一次调用的时间的,因此它受其他程序调用的影响,如果该函数在其他地方被手动调用,那么这个计时器就会重新计时。
initialDelay 参数是一个额外参数,比较简单,就是指定从项目开始运行到该函数首次被调用的执行时间,以毫秒计。如果不指定这个参数,这个值就是 -1,也就是程序开始时不执行。
cron 参数是一个非常复杂也是高度自定义化的定时工具。在 Spring Boot 中,一个 cron 字符串是由六个部分以空格组成的字符串,文档中的例子是这样的:
```
"0 0 * * * *" = the top of every hour of every day.
*/10 * * * * *" = every ten seconds.
"0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
"0 0 6,19 * * *" = 6:00 AM and 7:00 PM every day.
"0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30, 10:00 and 10:30 every day.
"0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
"0 0 0 25 12 ?" = every Christmas Day at midnight
```
六个部分分别表示秒、分、时、日、月、周。他支持 '-‘表示范围,'*'表示通配,'/‘表示在左边的时间匹配后间隔右边的时间,'?'一般表示周的通配。
在使用 cron 参数时,需要注意 cron 表达式的写法,避免出现错误。网上有很多类似 Cron 表达式测试工具这样的测试工具,方便我们测试自己写的 Cron 表达式。
例如,以下是一个每隔五分钟执行一次的 cron 表达式:
```java
@Scheduled(cron = "0 0/5 * * * ?")
public void scheduledTask() {
// do sth...
}
```
Spring Boot 提供了一个非常方便的接口来实现定时任务,我们只需要根据需要选择合适的参数和 cron 表达式,就可以实现复杂的定时任务。