Spring Task
是 Spring 提供的一种轻量级定时任务调度功能,内置在 Spring 框架中。与 Quartz 等重量级调度框架相比,Spring Task 使用简便,无需额外依赖,适合在简单的调度任务场景中使用。通过注解配置方式,开发者可以快速实现周期性任务执行,非常适合 Spring Boot 项目中的定时任务需求。
1. 介绍
Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑。
- 简介:Spring Task 提供了 @Scheduled 注解,通过此注解可以为方法添加定时任务,实现任务调度。
- 使用场景:需要定时处理的场景都可以使用Spring Task 。
- 主要特性:
- 简单配置:只需简单的注解配置,使用方便。
- 支持多种时间表达式:支持固定速率执行、固定延迟执行和 Cron 表达式调度。
- 灵活性:可配合 Spring Boot 的配置文件,实现动态任务调度。
2. 使用步骤
2.1 引入依赖
Spring Task 是 Spring 框架的内置功能,在 Spring Boot 项目中无需额外依赖,仅需在主启动类中启用定时任务。
2.2 启用定时任务
在 Spring Boot 项目主启动类中,通过 @EnableScheduling
注解启用定时任务调度。
@SpringBootApplication
@EnableScheduling // 启用定时任务功能
public class TaskApplication {public static void main(String[] args) {SpringApplication.run(TaskApplication.class, args);}
}
2.3 使用 @Scheduled 注解定义定时任务
@Scheduled
注解用于声明一个方法为定时任务,可以配置不同的时间策略:
fixedRate
:以固定频率执行,任务开始到下次任务开始的时间间隔固定,单位为毫秒。fixedDelay
:以固定延迟执行,任务结束到下次任务开始的时间间隔固定,单位为毫秒。cron
:使用 Cron 表达式,支持更精细的调度。
3. @Scheduled 注解的属性详解
3.1 cron
属性
cron表达式在线生成器:在线Cron表达式生成器
ron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义
- 作用:使用 Cron 表达式来控制任务的执行时间,支持精确的时间控制。
- Cron 表达式结构:
秒 分 时 日 月 星期 [年]
- 示例:任务在每天上午 10:00 执行一次。
@Scheduled(cron = "0 0 10 * * ?")
public void cronTask() {System.out.println("Cron task executed at " + LocalDateTime.now());
}
*
:表示任意值,例如*
表示每分钟。?
:仅用于“日”和“星期”字段,表示不指定具体的值。-
:表示范围,如10-12
表示 10 点到 12 点。,
:表示列出多个值,如MON,WED,FRI
表示星期一、三、五。/
:表示增量,如0/5
表示从 0 开始每隔 5 个单位。L
:用于“日”和“星期”字段,表示最后一天或最后一个星期几。W
:用于“日”字段,表示离指定日期最近的工作日。#
:用于“星期”字段,表示第几个星期几,如4#2
表示每月第 2 个星期三。
说明:一般日和周的值不同时设置,其中一个设置,另一个用?表示。
3.2 fixedRate
属性
- 作用:设置任务的固定频率(单位:毫秒),任务开始到下次任务开始的时间间隔固定。
- 示例:任务每隔 5 秒执行一次,无论上一次任务是否完成,都会在指定的时间间隔后再次执行。
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {System.out.println("Fixed rate task executed at " + LocalDateTime.now());
}
3.3 fixedDelay
属性
- 作用:设置任务的固定延迟(单位:毫秒),上一次任务结束到下次任务开始的时间间隔固定。
- 示例:任务在上一次任务结束后延迟 5 秒再执行一次。
@Scheduled(fixedDelay = 5000)
public void fixedDelayTask() {System.out.println("Fixed delay task executed at " + LocalDateTime.now());
}
4. Spring Task 定时任务案例
4.1 创建定时任务类
在 MyTask
中定义各种类型的定时任务方法,使用 @Scheduled
注解指定任务的执行策略。
/*** 自定义定时任务类*/
@Component
@Slf4j
public class MyTask{// 每5秒执行一次任务@Scheduled(fixedRate = 5000)public void fixedRateTask() {System.out.println("Fixed rate task executed at " + LocalDateTime.now());}// 上一次任务结束后延迟5秒再执行任务@Scheduled(fixedDelay = 5000)public void fixedDelayTask() {System.out.println("Fixed delay task executed at " + LocalDateTime.now());}// 每天上午10:00执行任务@Scheduled(cron = "0 0 10 * * ?")public void cronTask() {System.out.println("Cron task executed at " + LocalDateTime.now());}
}
4.2 配置动态化定时任务时间
Spring Task 的默认时间配置在注解中直接设置,但也可以从配置文件读取定时任务的时间,增加动态配置的灵活性。
# application.properties
task.fixed-rate=5000
task.fixed-delay=5000
task.cron-expression=0 0 10 * * ?
在 MyTask
中使用 @Value
注解读取配置文件中的值。
/*** 自定义定时任务类*/
@Component
@Slf4j
public class MyTask{@Scheduled(fixedRateString = "${task.fixed-rate}")public void fixedRateTask() {System.out.println("Dynamic fixed rate task executed at " + LocalDateTime.now());}@Scheduled(fixedDelayString = "${task.fixed-delay}")public void fixedDelayTask() {System.out.println("Dynamic fixed delay task executed at " + LocalDateTime.now());}@Scheduled(cron = "${task.cron-expression}")public void cronTask() {System.out.println("Dynamic cron task executed at " + LocalDateTime.now());}
}