# DynamicScheduler **Repository Path**: qushen0925/DynamicScheduler ## Basic Information - **Project Name**: DynamicScheduler - **Description**: No description available - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-12-23 - **Last Updated**: 2025-02-15 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot 动态定时任务管理系统(轻量级实现) **项目背景**: 在Spring Boot项目中,实现动态增删和启停定时任务的功能对于许多应用场景来说至关重要。虽然Quartz框架是一个广泛使用的解决方案,但其复杂性和重量级特性可能使得项目变得臃肿和难以维护。为了解决这个问题,本项目旨在实现一个轻量级的定时任务管理系统,不依赖外部框架,仅利用Spring Boot和Java标准库的功能,特别适用于单体项目。 **项目目标**: 1. 实现一个轻量级的定时任务管理系统。 2. 支持动态增删定时任务。 3. 支持动态启停定时任务。 4. 避免项目依赖过多外部框架,保持项目简洁和高效。 **核心实现思路**: - 利用Java的`ScheduledExecutorService`来管理定时任务的调度和执行。 - 设计一个服务类`TaskSchedulerService`,该类负责任务的创建、删除、启动和停止。 - 使用`ConcurrentHashMap`来存储任务ID和对应的`ScheduledFuture`对象,以便实现任务的动态管理。 - 通过原子整数`AtomicInteger`来生成唯一的任务ID。 - 提供RESTful接口或Spring MVC控制器来接收客户端的增删启停请求,并调用`TaskSchedulerService`进行相应操作。 **关键模块**: 1. TaskSchedulerService : 核心服务类,负责任务的调度和管理。 - `scheduleTask(Runnable task, long initialDelay, long period)`: 提交一个新任务,并返回任务ID。 - `cancelTask(String taskId)`: 取消指定ID的任务。 - `pauseTask(String taskId)`: 暂停指定ID的任务(可能需要实现自定义逻辑,因为`ScheduledExecutorService`本身不支持暂停)。 - `resumeTask(String taskId)`: 恢复指定ID的任务(同样需要自定义逻辑)。 2. RESTful接口/Spring MVC控制器 : 负责接收和处理客户端请求。 - 提供端点来创建、删除、启动和停止定时任务。 - 验证请求参数并调用`TaskSchedulerService`的相应方法。 - 返回操作结果给客户端。 3. 任务管理界面(可选) : 提供一个简单的Web界面来管理定时任务(如果项目需要)。 - 列出当前所有任务及其状态。 - 提供按钮来增删启停任务。 **技术栈**: - Spring Boot: 用于构建和部署Web应用。 - Java: 编程语言。 - `ScheduledExecutorService`: 用于任务调度。 - `ConcurrentHashMap`和`AtomicInteger`: 用于任务管理。 **项目优势**: - 轻量级:不依赖外部框架,如Quartz、ElasticJob等,避免了项目复杂性和额外的配置。 - 灵活性:能够动态增、删、启、停定时任务,满足不同业务需求。 - 高可维护性:基于Spring Boot框架,代码清晰、易于扩展和维护。 - 易于集成:适用于任何Spring Boot项目,尤其适合单体应用,不需要复杂的配置和集成过程。 **项目启动**: 数据库表: ```sql DROP TABLE IF EXISTS `scheduled_jobs`; CREATE TABLE `scheduled_jobs` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '任务ID,唯一标识每个定时任务', `method_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '方法名称,执行定时任务时调用的方法名', `cron_expression` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'cron表达式,定义定时任务的执行时间规则', `status` int(11) NOT NULL DEFAULT 1 COMMENT '任务状态,1为正常运行,0为暂停', `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '任务正文,具体需要执行的内筒', `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '任务的备注信息,描述任务的其他细节', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '任务创建时间,自动设置为当前时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '任务最后更新时间,每次更新时自动更新时间', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1391804419 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; ``` 请求接口: - http://localhost:8080/tasks/add?cronExpression=1/30 * * * * ? &methodName=testMethod2&content=这个是要运行的内容2