李锋镝的博客

  • 首页
  • 时间轴
  • 说说
  • 每日心情
  • Now
  • 系列文章
  • 论坛
  • 左邻右舍
    • 左邻右舍
    • 博友圈
  • 留言
    • 留言
    • 走心评论
  • 关于
    • 关于我
    • 网站地图
    • 网站统计
    • 另一个网站
    • 我的导航站
    • 赞助
  • 🚇开往
Destiny
自是人生长恨水长东
  1. 首页
  2. 后端
  3. 正文

SchedulingConfigurer详解

2026年5月15日 约 609 字3 分钟 95 1 2

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)

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

五、适用场景

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


六、和 @Scheduled 对比

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

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

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

推荐阅读

  • Spring Boot 指定外部配置文件的方式
  • Spring Boot 配置加载优先级总结
  • 关于服务的探活端口和业务端口不一致有什么问题
  • Spring WebFlux底层原理深度剖析-从响应式流到事件循环的全链路拆解
  • Spring WebFlux深度解析:异步非阻塞架构与实战落地指南
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: Scheduled SchedulingConfigurer Spring
最后更新:2026年5月15日
相关文章
  • Spring Boot 指定外部配置文件的方式2026年8月6日
  • Spring中@Autowired和@Resource的区别详解2021年1月15日
  • 通俗解释下Spring的Ioc原理2019年11月13日
  • 关于服务的探活端口和业务端口不一致有什么问题2026年8月3日
  • 解锁 Spring Boot 10 个高频 "神仙功能"2025年10月15日

李锋镝

既然选择了远方,便只顾风雨兼程。

打赏 点赞
< 上一篇
下一篇 >
1234567891112131415161718192021222324252627282930313233343536373839404142434446474849505152535455575859606162636465666769727476777879808182858687909293949596979899
取消回复

文章评论

  • 皮皮社长Lv 2友

    不懂技术,打个水卡。破了这个0评论。 :18:

    AndroidChrome 131.0.6778.200 中国-湖南-长沙
    2026年5月18日
    00 回复
    • 李锋镝管理

      @皮皮社长 沙发-。-

      macOSChrome 148.0.0.0 中国-北京
      2026年5月18日
      00 回复
  • Your time is limited, so don't waste it living someone else's life. Don't be trapped by dogma -- which is living with the results of other people's thinking. Don't let the noise of other's opinions drown out your own inner voice. And most important, have the courage to follow your heart and intuition. They somehow already know what you truly want to become. Everything else is secondary.

    听点儿音乐吧 朋友~
    文章目录
    最新 热点 随机
    最新 热点 随机
    每日早报 · 2026年8月18日 写了一个订阅每日新闻的WP插件 每日早报 · 2026年8月17日 每日早报 · 2026年8月16日 每日早报 · 2026年8月15日 每日早报 · 2026年8月14日
    给主题增加了Now、每日心情、年度回顾、岁月同一天、随机漫步等功能Kratos+ v1.1.16版本更新说明AI时代,个人技术博客的出路在哪里?增加了两套复古皮肤-牛皮纸、千禧网页这个域名注册整整十年了,十年时间,真快啊Kratos+ v1.1.14版本更新说明
    CC知识共享协议各协议内容解释 深度解析多级缓存架构:从设计到落地,彻底解决数据一致性难题 从零开始入门 K8s | Kubernetes 网络概念及策略控制 AI原生数据库新标杆:seekdb深度解析,轻量架构与混合搜索的双重革命 结合Apollo配置中心实现日志级别动态配置 使用RocketMQ时,服务启动过程中,Consumer在服务未启动时消费消息问题处理
    最近评论
    李锋镝 发布于 3 小时前(08月18日) 给主题加了个功能,可以在RSS中排除指定分类,哈哈哈
    李锋镝 发布于 4 小时前(08月18日) :8: 喜欢就好
    不凡 发布于 14 小时前(08月17日) 哇,配色真好看,观感很舒服! :52:
    李锋镝 发布于 17 小时前(08月17日) 哈哈哈,那个插件我之前也用过,那个内容都是固定的,我这个每天不同的时间拉取数据也不一样,等我研究研究...
    Hary 发布于 17 小时前(08月17日) emmm大哥,这样每天输出到博客,然后别人订阅rss全是这个,有点不太好,之前很流行一段时间每天60...
    标签聚合
    Redis MQ JVM MySQL 多线程 ElasticSearch 日常 Claude IDEA AI 分布式 SpringBoot SQL AI编程 K8s 数据库 WordPress JAVA 架构 Spring
    友情链接
    • 瓦匠个人小站
    • 若梦博客
    • 九仞之行
    • 老张博客
    • 知向前端
    • 哥斯拉
    • Honesty
    • 韩情脉脉
    • 皮皮社
    • Serendipity
    • Mr.Sun的博客
    • 韩小韩博客
    • 志文工作室
    • 懋和道人
    • 临窗旋墨
    • 搬砖日记
    • 林羽凡
    • 彬红茶日记
    • 蜗牛工作室
    • sssr7844的博客

    COPYRIGHT © 2026 lifengdi.com. ALL RIGHTS RESERVED.

    正在博友圈履约中

    域名年龄

    Theme Kratos+ By Dylan Li

    津ICP备2024022503号-3

    京公网安备11011502039375号