SchedulingConfigurer 是 Spring 定时任务的高级配置接口,用来替代简单的 @Scheduled 注解。
它的核心作用:
让定时任务支持:动态修改执行周期、程序运行中改 cron、从数据库/配置中心读取 cron 表达式,不用重启服务。
一、它解决什么问题?
@Scheduled(cron = "0 0/1 * * * ?"):写死在代码里,改时间必须重启SchedulingConfigurer:cron 可以动态变(数据库/配置文件/Nacos 实时读取)
二、DEMO
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
@Configuration
@EnableScheduling // 开启定时任务
public class DynamicScheduleConfig implements SchedulingConfigurer {
// 动态 cron(实际项目从数据库/配置读取)
private String getCron() {
// 示例:每秒执行一次
return "0/1 * * * * ?";
}
// 定时任务要执行的业务
private void doTask() {
System.out.println("动态定时任务执行:" + System.currentTimeMillis());
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
// 注册一个动态 cron 任务
taskRegistrar.addTriggerTask(
// 1. 任务内容
() -> doTask(),
// 2. 动态 cron 触发器
triggerContext -> {
// 每次执行前都会重新获取 cron → 支持动态修改
String cron = getCron();
return new CronTrigger(cron).nextExecutionTime(triggerContext);
}
);
}
}
三、核心知识点
1. 关键方法
void configureTasks(ScheduledTaskRegistrar taskRegistrar);
所有动态任务都在这里注册。
2. 为什么能动态?
因为每次任务执行前,都会重新调用 getCron() 获取最新表达式。
你只要:
- 把 cron 存在数据库
- 提供一个接口修改它
- 不用重启服务 → 定时任务自动生效
3. 多线程配置
Spring 默认定时任务是单线程!
如果任务多、执行慢,会互相阻塞。
添加线程池配置:
@Bean
public Executor taskExecutor() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(10); // 10个线程
executor.setThreadNamePrefix("schedule-task-");
executor.initialize();
return executor;
}
然后注册任务时指定线程池:
taskRegistrar.setScheduler(taskExecutor());
四、企业级标准用法(数据库读取 cron)
- 建一张表:
sys_schedulecron表达式task_key任务标识status状态
- 在
getCron()里查库 - 提供接口修改 cron,实时生效
五、适用场景
✅ 动态修改定时任务周期(不用重启)
✅ 从数据库/配置中心读取 cron
✅ 复杂多任务调度
✅ 生产环境标准方案
六、和 @Scheduled 对比
| 方式 | 优点 | 缺点 |
|---|---|---|
| @Scheduled | 简单 | cron 写死,不能动态改 |
| SchedulingConfigurer | 动态、灵活、生产级 | 代码稍多 |
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

文章评论
不懂技术,打个水卡。破了这个0评论。
Chrome 131.0.6778.200中国-湖南
@皮皮社长 沙发-。-
Chrome 148.0.0.0中国