Spring Boot 中 TaskScheduler 支持动态定时任务调度,提供 schedule、scheduleAtFixedRate 等方法及 CronTrigger,返回 ScheduledFuture 便于生命周期管理,并需注意线程池大小配置。

在 Spring Boot 中使用 TaskScheduler 实现定时任务调度,核心是通过 Spring 提供的异步任务抽象,结合 ScheduledExecutorService 底层能力,实现更灵活、可编程的任务调度控制(比如动态增删、延迟执行、周期调整等),而不仅限于 @Scheduled 注解的静态配置。
启用定时任务支持
确保项目已开启任务调度功能:
- 在启动类或配置类上添加
@EnableScheduling(仅对@Scheduled必需;但若只用TaskScheduler编程式调度,此注解非必须) - 推荐引入
spring-boot-starter-quartz或直接依赖spring-context(已由 Web Starter 默认包含) - 无需额外配置即可使用 Spring 默认的
ThreadPoolTaskSchedulerBean
注入并使用 TaskScheduler
Spring Boot 自动配置了一个 ThreadPoolTaskScheduler 实例,可通过 @Autowired 注入:
@Service
public class MyTaskService {
@Autowired
private TaskScheduler taskScheduler;
<pre class="brush:php;toolbar:false;">public void scheduleFixedRateTask() {
Runnable task = () -> System.out.println("执行固定频率任务: " + LocalDateTime.now());
// 每 5 秒执行一次,初始延迟 2 秒
taskScheduler.scheduleAtFixedRate(task, Duration.ofSeconds(2), Duration.ofSeconds(5));
}}
常用调度方法包括:
-
schedule(Runnable, Date):指定时间点执行一次 -
schedule(Runnable, Trigger):配合CronTrigger或自定义Trigger实现 cron 表达式调度 -
scheduleAtFixedRate(Runnable, Duration):固定频率(以上次开始时间为基准) -
scheduleWithFixedDelay(Runnable, Duration):固定延时(以上次结束时间为基准)
使用 CronTrigger 实现类 cron 调度
若需 cron 表达式(如 "0 0 * * * ?"),可手动构造 CronTrigger:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
public void scheduleWithCron() {
Runnable task = () -> System.out.println("Cron 任务触发: " + LocalDateTime.now());
CronTrigger trigger = new CronTrigger("0 */2 * * * ?"); // 每两分钟执行
taskScheduler.schedule(task, trigger);
}
注意:CronTrigger 使用 Quartz 风格语法,支持秒级字段(6 位),与 Linux cron(5 位)不同。
管理调度任务生命周期(进阶)
实际场景中常需取消或替换任务。TaskScheduler.schedule() 返回 ScheduledFuture,可用于控制:
- 调用
future.cancel(true)可中断正在执行的任务 - 保存多个
ScheduledFuture引用,便于后续统一取消 - 避免内存泄漏:任务 Bean 若持有外部引用,建议在销毁前显式 cancel
例如在 @PreDestroy 中清理:
@PreDestroy
public void cleanup() {
if (future != null && !future.isCancelled()) {
future.cancel(true);
}
}
不复杂但容易忽略:默认线程池大小为 1,高并发定时任务可能阻塞;可通过 @Bean 自定义 ThreadPoolTaskScheduler 并设置 pool.size。










