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

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

本文章代码: gitee , gitcode , github

摘要

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

1. 核心组件

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

2. 动态注册流程

java 复制代码
// 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. 动态取消与销毁

java 复制代码
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 保护。
相关推荐
独泪了无痕27 分钟前
Spring Data Redis 快速上手
spring boot·redis·后端
wangchunyu1143 小时前
JAVA CompletableFuture异步编程实战
java·开发语言·python
paopaokaka_luck3 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
Thomas.Sir3 小时前
第9课:SpringBoot4.x Web开发基础:WebMvc自动配置、静态资源、请求参数接收
java·spring boot
程序 代码狂人4 小时前
切片表与分区表的区别(数据开发面试版)
java·大数据·开发语言·数据仓库·算法
m0_639906944 小时前
Linux 操作系统入门:目录结构、服务排查常用命令、Shell 脚本基础
linux·运维·后端
2501_944521594 小时前
Deepmerge 跨端三方库仓颉适配全流程
java·python·eclipse·github
holly就是我5 小时前
AI 编程助手为什么跑偏?用开源 ccglass 看清 Prompt、工具调用和 Token 消耗
人工智能·后端
鸿蒙开发5 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
用户788477316345 小时前
小程序后端三选一:云开发、.NET WebAPI、Node,我按客户现状分了三种答案
后端