[055][调度模块]Spring动态任务调度框架的设计与实现

简介: 本文设计并实现了一个基于Spring的动态任务调度框架,突破`@Scheduled`静态限制,支持运行时增删改任务、配置热加载及执行状态跟踪。核心采用`SchedulingConfigurer`与`TriggerTask`,解耦任务逻辑与调度机制,具备零侵入、线程安全、优雅停机等特性。(239字)

[055][调度模块]Spring动态任务调度框架的设计与实现

摘要

传统的 @Scheduled 注解适合静态任务,但难以满足动态增删改、运行时修改配置等需求。本文介绍一种基于 SchedulingConfigurer 和 ScheduledTaskRegistrar 的动态任务调度框架,支持从配置文件加载任务、运行时添加/取消任务,并提供任务执行状态跟踪。

1. 核心组件

  • ScheduleTaskManager:实现 SchedulingConfigurer,持有 ScheduledTaskRegistrar 实例,管理所有动态任务的注册与取消。
  • TaskRepository:任务数据源接口,用于加载所有任务(如 YAML、数据库)。
  • RunnableDecorator:包装 TaskRunner,同时充当 Runnable 和 Trigger,实现执行统计、条件判断和下一次执行时间计算。

2. 动态注册流程

// ScheduleTaskManager 核心方法
public void addTask(Task task) {
   
    if (!task.isEnabled()) return;
    if (triggerTaskMap.containsKey(task.getName())) return;
    doAddTask(task);
}

private synchronized void doAddTask(Task task) {
   
    TaskRunner taskRunner = SpringUtil.getBean(task.getClassSimpleName(), TaskRunner.class);
    RunnableDecorator decorator = new RunnableDecorator(task, taskRunner);
    TriggerTask triggerTask = new TriggerTask(decorator, decorator);
    ScheduledTask scheduledTask = scheduledTaskRegistrar.scheduleTriggerTask(triggerTask);
    triggerTaskMap.put(task.getName(), new ScheduledTaskData(scheduledTask, decorator, triggerTask));
}
  • 通过 task.getClassSimpleName() 从 Spring 容器中获取实现了 TaskRunner 接口的 Bean,实现任务逻辑与配置的解耦。
  • 每次 addTask 都会动态生成 TriggerTask 并注册到 ScheduledTaskRegistrar,返回 ScheduledTask 供后续取消。

3. 动态取消与销毁

public void cancelTask(String taskName) {
   
    ScheduledTaskData data = triggerTaskMap.get(taskName);
    if (data != null) {
   
        data.scheduledTask().cancel();
        triggerTaskMap.remove(taskName);
    }
}

在 @PreDestroy 阶段批量取消所有任务,确保优雅停机。

4. 设计亮点

  • 零侵入:业务任务只需实现 TaskRunner 接口,无需关心调度细节。
  • 运行时可控:通过 addTask / cancelTask 动态调整任务,可用于管理后台、运维接口等场景。
  • 线程安全:使用 ConcurrentHashMap 存储任务,关键方法使用 synchronized 保护。
目录
相关文章
|
1月前
|
JavaScript API 开发工具
DeepSeek Harness 0.1.1-rc.1 发布:我的插件和启动器已完成适配
DeepSeek Harness 发布 0.1.1-rc.1,本文整理官方版本状态,并介绍 dsh-billing、Error Lens、Git Inspect、Provider Probe、Concurrency Meter 与 dsh-launcher 的兼容更新。
DeepSeek Harness 0.1.1-rc.1 发布:我的插件和启动器已完成适配
|
24天前
|
弹性计算 缓存 运维
阿里云服务器特惠价格:轻量38元起,2核4G仅199元,个人和企业首选
2026年阿里云入门级云服务器的活动参考,针对个人开发者与普通企业用户的主流需求,梳理了不同配置的高性价比选型方案。其中2核2G档位推出两大爆款:轻量应用服务器低至38元首年,适配个人博客、展示型官网等轻负载场景;经济型e实例2核2G仅99元/年,新老用户同享,可支撑中小型Web应用运行。2核4G档位中,通用算力型u1实例以199元/年的价格搭配5M固定带宽,成为企业级入门场景的高性价比首选。
|
2月前
|
人工智能 安全 API
阿里云百炼Coding Plan完整指南:模型支持、接入步骤与订阅优惠指南
阿里云百炼Coding Plan是专为AI编程场景打造的订阅制模型服务,以固定月费模式提供稳定、高性价比的AI编程能力,彻底告别按量计费的成本焦虑。它整合多厂商顶级编程模型,兼容主流AI开发工具,通过专属API凭证与严格使用规范,保障服务稳定性与安全性。以下从核心功能、支持模型、接入配置、订阅规则、省钱策略与使用限制六大维度,全面解析Coding Plan的完整使用体系。
771 3
|
16天前
|
缓存 前端开发 安全
[070][Web模块]Spring MVC TOTP 二次认证拦截器:设计与源码深度解析
本文深度解析Spring MVC中TOTP二次认证拦截器的设计与实现,涵盖`@TotpAuth`注解、拦截器逻辑、Google Authenticator验证集成及安全优化建议,助力构建高安全Web应用。(239字)
61 2
|
1月前
|
NoSQL 调度 Redis
[057][调度模块]分布式环境下定时任务的防重复执行方案
本文介绍分布式定时任务防重复执行方案,基于Redis/Redisson分布式锁,提供自动续期与固定租期两种模式,通过`key()`控制锁粒度,支持异常跳过与自定义处理,确保集群中同一任务仅单点执行。代码开源。
117 1
|
12天前
|
缓存 Shell Linux
dsh 更新了版本没变怎么办?DeepSeek Harness 多份安装、PATH 与缓存排查
dsh 更新了版本没变,先分清三层:磁盘上的包、PATH 命中的命令、正在跑的进程。最常见是服务没重启与多份安装;本文给 which -a、npm root -g、hash -r 与缓存、镜像滞后的逐项排查。
125 3
|
2月前
|
缓存 Java 数据库连接
[053][核心模块]Java枚举缓存与ORM集成实践
本文介绍Java枚举缓存与ORM(MyBatis/JPA)的通用集成方案:通过`EnumCache`双向哈希缓存(O(1)查找)、`BaseEnum`统一接口及自动注册的类型转换器,解决枚举查值性能低、重复编码、缓存不一致等痛点,提升可维护性与运行效率。(239字)
182 3
|
1月前
|
存储 缓存 NoSQL
[038][验证码模块]基于 Hutool 的 Spring Boot 验证码组件设计与实现
本文介绍基于Hutool与Spring Boot深度集成的验证码组件,支持线段、圆圈、扭曲、GIF四类验证码,具备自动配置、多级缓存(Caffeine+Redis)、高斯模糊增强、忽略大小写校验及一次性使用等特性,架构清晰、扩展性强,开箱即用。
82 2
|
1月前
|
消息中间件 Prometheus 监控
[058][调度模块]任务生命周期事件与监听器机制
本文介绍调度模块的任务生命周期事件机制,通过`ChangeStatusEvent`事件与`ChangeStatusEventConsumer`监听器,实现任务状态(CREATED/STARTED/COMPLETED等)变更的灵活监听。支持日志、持久化、消息推送等扩展,具备高解耦性与异常隔离能力。(239字)
75 2
|
1月前
|
缓存 NoSQL 安全
[036][缓存模块]基于 Redis 自定义缓存锁的设计与实现
本文介绍基于Redis的轻量级分布式缓存锁组件,通过`@RedisLockable`注解+ AOP + Lua脚本,支持固定租期与自动续期双模式,解决缓存击穿、重复计算与资源竞争问题,具备声明式、动态Key、原子性及安全释放等特性,代码开源可扩展。(239字)
93 2

热门文章

最新文章