惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

文章列表

codebase-memory-mcp 极简完整使用指南 Claude Haiku 4.5、Claude Sonnet 4.6、Claude Opus 4.7 区别以及各自的新特性 踩坑60+次后,我终于搞懂 Claude Skill 怎么写才会真的触发 Everything Claude Code 详细使用文档 配置Jackson使用字段而不是getter/setter来序列化和反序列化 这个域名注册整整十年了,十年时间,真快啊 Claude Code全维度实战指南:从入门到精通,解锁AI编程新范式 Apollo配置中心中的protalDB的作用是什么 org.apache.ibatis.plugin.Interceptor类详细介绍及使用
SchedulingConfigurer详解
李锋镝 · 2026-05-15 · via

SchedulingConfigurerSpring 定时任务的高级配置接口,用来替代简单的 @Scheduled 注解。

它的核心作用:
让定时任务支持:动态修改执行周期、程序运行中改 cron、从数据库/配置中心读取 cron 表达式,不用重启服务。


一、它解决什么问题?

  • @Scheduled(cron = "0 0/1 * * * ?")写死在代码里,改时间必须重启
  • SchedulingConfigurercron 可以动态变(数据库/配置文件/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)

  1. 建一张表:sys_schedule
    • cron 表达式
    • task_key 任务标识
    • status 状态
  2. getCron() 里查库
  3. 提供接口修改 cron,实时生效

五、适用场景

✅ 动态修改定时任务周期(不用重启)
✅ 从数据库/配置中心读取 cron
✅ 复杂多任务调度
✅ 生产环境标准方案


六、和 @Scheduled 对比

方式 优点 缺点
@Scheduled 简单 cron 写死,不能动态改
SchedulingConfigurer 动态、灵活、生产级 代码稍多

除非注明,否则均为李锋镝的博客原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.lifengdi.com/hou-duan/4701