
























SchedulingConfigurer 是 Spring 定时任务的高级配置接口,用来替代简单的 @Scheduled 注解。
它的核心作用:
让定时任务支持:动态修改执行周期、程序运行中改 cron、从数据库/配置中心读取 cron 表达式,不用重启服务。
@Scheduled(cron = "0 0/1 * * * ?"):写死在代码里,改时间必须重启SchedulingConfigurer:cron 可以动态变(数据库/配置文件/Nacos 实时读取)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);
}
);
}
}
void configureTasks(ScheduledTaskRegistrar taskRegistrar);
所有动态任务都在这里注册。
因为每次任务执行前,都会重新调用 getCron() 获取最新表达式。
你只要:
Spring 默认定时任务是单线程!
如果任务多、执行慢,会互相阻塞。
添加线程池配置:
@Bean
public Executor taskExecutor() {
ThreadPoolTaskScheduler executor = new ThreadPoolTaskScheduler();
executor.setPoolSize(10); // 10个线程
executor.setThreadNamePrefix("schedule-task-");
executor.initialize();
return executor;
}
然后注册任务时指定线程池:
taskRegistrar.setScheduler(taskExecutor());
sys_schedule
cron 表达式task_key 任务标识status 状态getCron() 里查库✅ 动态修改定时任务周期(不用重启)
✅ 从数据库/配置中心读取 cron
✅ 复杂多任务调度
✅ 生产环境标准方案
| 方式 | 优点 | 缺点 |
|---|---|---|
| @Scheduled | 简单 | cron 写死,不能动态改 |
| SchedulingConfigurer | 动态、灵活、生产级 | 代码稍多 |
除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。