SpringBoot整合定时任务
Spring Boot整合定时任务
核心结论:Spring Boot 定时任务是基于 Spring Task 实现的、按指定时间规则自动执行任务的功能,需通过 @EnableScheduling 开启支持、@Scheduled 定义执行规则,适用于周期性业务场景,实现简单且无需额外复杂配置。
一、定时任务是什么?
定时任务是指按照预设的时间规则(如固定间隔、指定时间点、特定周期)自动执行的程序逻辑。
在 Spring Boot 中,定时任务基于 Spring 框架的 Spring Task 组件实现,支持注解式配置,无需整合第三方框架(如 Quartz)即可快速实现,核心是通过注解指定任务执行规则,由 Spring 容器自动调度执行。
二、为什么需要定时任务?
- 解决周期性业务需求:无需人工干预,自动完成重复操作,比如每天凌晨备份数据、每月初生成报表。
- 提升系统自动化水平:减少手动操作成本,避免人为失误,比如定时清理系统缓存、自动发送定时通知。
- 适配业务时间规则:满足特定时间点的业务触发,比如工作日早 9 点发送考勤提醒、每周日晚同步数据。
三、案例实践

1. 环境准备
构建Maven项目,项目名为SpringBootSchedule-Demo,修改pom.xml。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!-- SpringBoot父依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.4</version>
<relativePath/>
</parent>
<groupId>com.yqd</groupId>
<artifactId>SpringBootSchedule-Demo</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>SpringBootSchedule-Demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- Spring Web:提供 HTTP 测试接口 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2. 核心步骤
步骤 1:开启定时任务支持
在项目启动类上添加 @EnableScheduling 注解,开启基于注解的定时任务调度支持。
package com.yqd;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 开启定时任务支持
public class TimerTaskApplication {
public static void main(String[] args) {
SpringApplication.run(TimerTaskApplication.class, args);
}
}
步骤 2:编写定时任务业务类
在 com.yqd.service 包下创建定时任务处理类,通过 @Scheduled 注解定义具体任务及执行规则。
package com.yqd.service;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.Date;
@Service // 注入 Spring 容器
public class ScheduledTaskService {
// 格式化时间输出
private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
/**
* 示例 1:固定间隔执行(上一次任务结束后,间隔 3 秒执行下一次)
*/
@Scheduled(fixedDelay = 3000)
public void fixedDelayTask() {
System.out.println("固定间隔任务执行,当前时间:" + sdf.format(new Date()));
}
/**
* 示例 2:固定频率执行(每隔 5 秒执行一次,无论上一次是否结束)
*/
@Scheduled(fixedRate = 5000)
public void fixedRateTask() {
System.out.println("固定频率任务执行,当前时间:" + sdf.format(new Date()));
}
/**
* 示例 3:Cron 表达式执行(每天 10:30:00 执行)
* Cron 格式:秒 分 时 日 月 周
*/
@Scheduled(cron = "0 30 10 * * ?")
public void cronTask() {
System.out.println("Cron 定时任务执行,当前时间:" + sdf.format(new Date()));
}
/**
* 示例 4:延迟初始化执行(项目启动后延迟 10 秒,再每隔 6 秒执行一次)
*/
@Scheduled(initialDelay = 10000, fixedRate = 6000)
public void initialDelayTask() {
System.out.println("延迟初始化任务执行,当前时间:" + sdf.format(new Date()));
}
}
步骤 3:核心注解与参数说明
(1)@EnableScheduling
- 作用:开启 Spring 定时任务调度支持。
- 位置:仅需在项目启动类上添加一次。
(2)@Scheduled 核心属性
| 属性 | 说明 | 示例 |
|---|---|---|
| fixedDelay | 上一次任务结束后,间隔指定毫秒数执行下一次(long 类型) | fixedDelay = 3000(间隔 3 秒) |
| fixedRate | 每隔指定毫秒数执行一次,忽略上一次任务执行时长(long 类型) | fixedRate = 5000(每隔 5 秒) |
| fixedDelayString | 与 fixedDelay 功能一致,参数为字符串类型(支持占位符) | fixedDelayString = "3000" |
| fixedRateString | 与 fixedRate 功能一致,参数为字符串类型(支持占位符) | fixedRateString = "5000" |
| initialDelay | 项目启动后,延迟指定毫秒数执行第一次任务(需配合 fixedRate/fixedDelay) | initialDelay = 10000(延迟 10 秒) |
| cron | 自定义执行时间规则(最灵活),格式:秒 分 时 日 月 周 | 0 30 10 * * ?(每天 10:30) |
(3)Cron 表达式常用规则
| 通配符 | 说明 | 示例 |
|---|---|---|
| * | 匹配该域所有值 | * * * * * ?(每秒执行一次) |
| ? | 不指定值(仅用于日、周) | 0 0 12 * * ?(每天 12 点执行) |
| , | 枚举多个值 | 0 0 9,18 * * ?(每天 9 点、18 点执行) |
| - | 指定区间 | 0 0 9-12 * * ?(每天 9-12 点整点执行) |
| / | 指定步长 | 0 */10 * * * ?(每隔 10 分钟执行一次) |
| L | 表示 “最后”(用于日、周) | 0 0 * L * ?(每月最后一天整点执行) |
3. 测试效果
启动 Spring Boot 项目,控制台会输出各定时任务的执行日志,示例如下:
固定间隔任务执行,当前时间:2025-10-29 17:43:24
固定频率任务执行,当前时间:2025-10-29 17:43:26
固定间隔任务执行,当前时间:2025-10-29 17:43:27
固定间隔任务执行,当前时间:2025-10-29 17:43:30
延迟初始化任务执行,当前时间:2025-10-29 17:43:31
固定频率任务执行,当前时间:2025-10-29 17:43:31
固定间隔任务执行,当前时间:2025-10-29 17:43:33
固定频率任务执行,当前时间:2025-10-29 17:43:36
固定间隔任务执行,当前时间:2025-10-29 17:43:36
延迟初始化任务执行,当前时间:2025-10-29 17:43:37
固定间隔任务执行,当前时间:2025-10-29 17:43:39
固定频率任务执行,当前时间:2025-10-29 17:43:41
固定间隔任务执行,当前时间:2025-10-29 17:43:42
延迟初始化任务执行,当前时间:2025-10-29 17:43:43
固定间隔任务执行,当前时间:2025-10-29 17:43:45
固定频率任务执行,当前时间:2025-10-29 17:43:46
四、注意事项
- 定时任务默认是单线程执行,若任务执行时间过长,会导致后续任务阻塞,可通过配置线程池优化。
- Cron 表达式中 “日” 和 “周” 不能同时指定具体值,需用
?忽略其中一个(避免冲突)。 - 若需动态调整定时任务(如修改执行频率),Spring Task 原生不支持,可考虑整合 Quartz 框架。

浙公网安备 33010602011771号