一. 介绍
Spring Task 是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑,无需依赖额外组件(如 Quartz),配置简单、使用便捷,适合处理周期性执行的任务(如定时备份数据、定时发送报表、定时清理缓存等)。
1. 核心特点:
- 轻量级:属于 Spring 框架自带模块,无需额外引入依赖(Spring 3.0+ 已内置)。
- 易用性:通过注解(如
@Scheduled
)即可快速配置定时任务,无需复杂 XML 配置。 - 支持多种调度策略:可按固定速率、固定延迟、Cron 表达式等方式触发任务。
- 与 Spring 生态无缝集成:能直接注入 Spring 容器中的 Bean,方便使用业务逻辑组件。
2.应用场景:
- 每日凌晨凌晨 2 点自动备份数据库
- 每小时清理过期缓存数据
- 每天 8 点推送用户消息通知
- 每周一生成上周销售报表
- 每 10 分钟检查并提醒即将超时的订单
- 每月 1 日删除 3 个月前的无效订单
- 每 5 分钟监控服务器运行状态
- 每天凌晨预热热门商品缓存数据
二. corn表达式
要使用Spring Task,必须学会corn表达式。
Cron 表达式是用于定义定时任务执行时间的字符串格式,由 6 或 7 个空格分隔的字段组成,分别代表不同的时间单位,基本格式如下(从左到右):
秒 分 时 日 月 周 [年]
(年是可选字段,通常省略)
常用特殊字符含义
*
:匹配所有值(如 “分” 字段为*
表示每分钟)?
:仅用于 “日” 和 “周”,表示不指定具体值(避免两者冲突)/
:表示递增(如0/5
表示从 0 开始,每 5 单位执行一次)-
:表示范围(如10-12
表示 10 到 12),
:表示多个值(如MON,WED,FRI
表示周一、三、五)
常见示例
0 0 2 * * ?
→ 每天凌晨 2 点执行0 0 8,18 * * ?
→ 每天 8 点和 18 点执行0 0/30 9-17 * * ?
→ 工作日 9 点到 17 点,每 30 分钟执行0 0 12 ? * WED
→ 每周三中午 12 点执行0 0 1 1 * ?
→ 每月 1 日凌晨 1 点执行0/5 * * * * ?
→ 每 5 秒执行一次0 30 10 ? * MON-FRI
→ 工作日上午 10 点 30 分执行
三. 使用步骤
1. 导入maven坐标
Spring Task 是 Spring Framework 核心模块的一部分,不需要单独引入额外的 Maven 坐标。它包含在 Spring 核心依赖中,只要项目中引入了 Spring Context 相关依赖(几乎所有 Spring 项目都会包含),就可以直接使用 Spring Task 的功能。
最常见的引入方式是通过 Spring Boot starter 间接包含,例如:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<!-- 版本号通常由 Spring Boot 父工程统一管理 -->
</dependency>
2. 在启动类上添加注解@EnableScheduling开启任务调度
@SpringBootApplication
@Slf4j
@EnableScheduling//开启任务调度
public class SkyApplication {
public static void main(String[] args) {
SpringApplication.run(SkyApplication.class, args);
log.info("server started");
}
}
3. 自定义定时任务类
这里写一个简单的例子:
/**
* 自定义定时任务类
*/
@Component
@Slf4j
public class Mytask {
/**
* 定时任务 每五秒执行一次
*/
@Scheduled(cron = "0/5 * * * * ?")
public void task(){
log.info("定时任务开始执行:{}", new Date());
}
}
注解:
@Component
:将该类注册到 Spring 容器中,使其成为被管理的 Bean。@Slf4j
:Lombok 提供的注解,自动生成日志对象log
,用于打印日志。@Scheduled(cron = "0/5 * * * * ?")
:核心注解,通过 Cron 表达式0/5 * * * * ?
指定任务执行规则
方法task:任务执行的具体逻辑,可以将这里替换为需要定时处理的业务