SpringBoot + 动态 Cron 表达式 + Web 界面修改 示例工程
项目简介
本项目是一个基于Spring Boot的动态任务调度示例工程,演示了如何实现动态Cron表达式修改和Web界面管理,让运营人员可以自助调整任务执行时间。
核心功能
- 动态 Cron 表达式:将cron表达式存储在数据库中,支持运行时动态修改
- Spring Task 调度:使用Spring的TaskScheduler,支持动态添加、修改、删除定时任务
- Web 界面管理:提供直观的Web界面,让运营人员可以自助调整任务时间
- 任务执行日志:记录任务执行状态和详细日志,便于排查问题
- 权限控制:支持基于角色的权限控制,确保只有授权人员可以修改任务配置
技术栈
- Spring Boot 2.7.5
- Spring Web
- Spring Data JPA
- Spring Security
- MySQL 8.0
- Lombok
工程结构
dynamic-cron-demo/
├── src/
│ ├── main/
│ │ ├── java/com/example/demo/
│ │ │ ├── config/ # 配置类
│ │ │ ├── controller/ # 控制器
│ │ │ ├── dto/ # 数据传输对象
│ │ │ ├── entity/ # 实体类
│ │ │ ├── repository/ # 仓库类
│ │ │ ├── service/ # 服务类
│ │ │ └── DemoApplication.java # 主类
│ │ └── resources/
│ │ ├── static/ # 静态资源
│ │ │ └── index.html # Web界面
│ │ └── application.yml # 配置文件
│ └── test/ # 测试类
├── pom.xml # Maven依赖
└── README.md # 说明文档
## 核心实现
### 1. 数据库设计
在MySQL中创建任务配置表和任务执行日志表:
```sql
-- 任务配置表
CREATE TABLE `task_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_name` varchar(100) NOT NULL COMMENT '任务名称',
`task_description` varchar(255) DEFAULT NULL COMMENT '任务描述',
`cron_expression` varchar(50) NOT NULL COMMENT 'Cron表达式',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_name` (`task_name`) COMMENT '任务名称唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务配置表';
-- 任务执行日志表
CREATE TABLE `task_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_name` varchar(100) NOT NULL COMMENT '任务名称',
`status` tinyint(4) NOT NULL COMMENT '执行状态:0-失败,1-成功',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`duration` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',
`error_message` text COMMENT '错误信息',
PRIMARY KEY (`id`),
KEY `idx_task_name` (`task_name`) COMMENT '任务名称索引',
KEY `idx_start_time` (`start_time`) COMMENT '开始时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务执行日志表';
2. 动态任务调度
使用Spring的TaskScheduler实现动态任务调度:
public void scheduleTask(TaskConfig taskConfig) {
try {
String taskName = taskConfig.getTaskName();
String cronExpression = taskConfig.getCronExpression();
// 取消已存在的任务
cancelTask(taskName);
// 创建任务执行器
Runnable taskRunner = createTaskRunner(taskName);
taskRunners.put(taskName, taskRunner);
// 创建Cron触发器
CronTrigger cronTrigger = new CronTrigger(cronExpression);
// 调度任务
ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(taskRunner, cronTrigger);
scheduledTasks.put(taskName, scheduledFuture);
log.info("任务 [{}] 调度成功,cron表达式:{}", taskName, cronExpression);
} catch (Exception e) {
log.error("调度任务失败", e);
throw new RuntimeException("调度任务失败:" + e.getMessage());
}
}
3. Web 界面管理
提供直观的Web界面,让运营人员可以自助调整任务时间:
- 任务列表展示
- 编辑Cron表达式
- 启用/禁用任务
- 查看任务执行日志
快速开始
1. 环境准备
- JDK 11+
- Maven 3.6+
- MySQL 8.0+
2. 创建数据库和表
CREATE DATABASE demo DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE demo;
-- 任务配置表
CREATE TABLE `task_config` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_name` varchar(100) NOT NULL COMMENT '任务名称',
`task_description` varchar(255) DEFAULT NULL COMMENT '任务描述',
`cron_expression` varchar(50) NOT NULL COMMENT 'Cron表达式',
`status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '状态:0-禁用,1-启用',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_task_name` (`task_name`) COMMENT '任务名称唯一索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务配置表';
-- 任务执行日志表
CREATE TABLE `task_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
`task_name` varchar(100) NOT NULL COMMENT '任务名称',
`status` tinyint(4) NOT NULL COMMENT '执行状态:0-失败,1-成功',
`start_time` datetime NOT NULL COMMENT '开始时间',
`end_time` datetime NOT NULL COMMENT '结束时间',
`duration` bigint(20) NOT NULL COMMENT '执行时长(毫秒)',
`error_message` text COMMENT '错误信息',
PRIMARY KEY (`id`),
KEY `idx_task_name` (`task_name`) COMMENT '任务名称索引',
KEY `idx_start_time` (`start_time`) COMMENT '开始时间索引'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务执行日志表';
-- 插入示例数据
INSERT INTO `task_config` (`task_name`, `task_description`, `cron_expression`, `status`) VALUES
('syncProducts', '同步商品数据', '0 0 2 * * ?', 1),
('checkInventory', '检查库存', '0 0 */3 * * ?', 1),
('generateReport', '生成报表', '0 0 0 * * ?', 1);
3. 修改配置
修改application.yml文件中的数据库连接信息:
spring:
datasource:
url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai
username: root
password: your_password
4. 构建项目
mvn clean package
5. 运行项目
java -jar target/dynamic-cron-demo-1.0.0.jar
6. 访问Web界面
打开浏览器,访问:http://localhost:8080
7. 测试功能
7.1 查看任务列表
Web界面会显示所有任务的名称、描述、Cron表达式和状态。
7.2 编辑Cron表达式
点击"编辑Cron"按钮,修改任务的执行时间,点击保存后立即生效。
7.3 启用/禁用任务
点击"启用"或"禁用"按钮,可以启用或禁用任务。
7.4 查看任务执行日志
点击"查看日志"按钮,可以查看任务的执行历史和详细日志。
测试API
1. 获取所有任务
curl http://localhost:8080/api/tasks
2. 更新任务Cron表达式
curl -X PUT http://localhost:8080/api/tasks/syncProducts/cron \
-H "Content-Type: application/json" \
-d '{"cronExpression": "0 0 4 * * ?"}'
3. 启用任务
curl -X PUT http://localhost:8080/api/tasks/syncProducts/enable
4. 禁用任务
curl -X PUT http://localhost:8080/api/tasks/syncProducts/disable
5. 获取任务执行日志
curl http://localhost:8080/api/tasks/syncProducts/logs
6. 获取任务状态
curl http://localhost:8080/api/tasks/status
最佳实践
- 任务设计:将任务逻辑与调度逻辑分离,便于维护
- Cron表达式:使用标准的Cron表达式格式,便于理解和维护
- 日志记录:记录详细的任务执行日志,便于排查问题
- 监控告警:监控任务执行状态,及时发现和解决问题
- 权限管理:根据角色分配任务管理权限,确保系统安全
- 备份恢复:定期备份任务配置,以便在系统故障时快速恢复
- 错误处理:妥善处理任务执行过程中的异常,确保系统稳定
注意事项
- 本示例使用了Spring的TaskScheduler,适合单机部署的应用
- 对于分布式部署的应用,建议使用分布式任务调度框架,如XXL-Job、Elastic-Job等
- 本示例的Web界面没有做权限控制,实际项目中应该添加权限管理
- 本示例的任务执行逻辑是模拟的,实际项目中需要替换为真实的业务逻辑
- 对于任务量较大的系统,建议优化任务执行逻辑,避免阻塞调度线程
总结
本示例工程演示了如何使用Spring Boot + 动态Cron表达式 + Web界面来实现运营人员可自助调整任务时间的功能。通过这套方案,运营人员可以自主调整任务执行时间,提高了工作效率,同时也减轻了开发人员的负担。
在实际项目中,可以根据具体的业务场景进行调整和优化,如添加更多的任务管理功能、增强权限控制、集成监控告警等。
联系方式
- 服务端技术精选:关注公众号,回复"动态任务调度",获取完整的代码示例和实现方案。
- 个人技术博客:www.jiangyi.space
标题:SpringBoot + 动态 Cron 表达式 + Web 界面修改 示例工程
作者:jiangyi
地址:http://jiangyi.space/articles/2026/02/28/1772115102480.html
公众号:服务端技术精选
评论