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

最佳实践

  1. 任务设计:将任务逻辑与调度逻辑分离,便于维护
  2. Cron表达式:使用标准的Cron表达式格式,便于理解和维护
  3. 日志记录:记录详细的任务执行日志,便于排查问题
  4. 监控告警:监控任务执行状态,及时发现和解决问题
  5. 权限管理:根据角色分配任务管理权限,确保系统安全
  6. 备份恢复:定期备份任务配置,以便在系统故障时快速恢复
  7. 错误处理:妥善处理任务执行过程中的异常,确保系统稳定

注意事项

  1. 本示例使用了Spring的TaskScheduler,适合单机部署的应用
  2. 对于分布式部署的应用,建议使用分布式任务调度框架,如XXL-Job、Elastic-Job等
  3. 本示例的Web界面没有做权限控制,实际项目中应该添加权限管理
  4. 本示例的任务执行逻辑是模拟的,实际项目中需要替换为真实的业务逻辑
  5. 对于任务量较大的系统,建议优化任务执行逻辑,避免阻塞调度线程

总结

本示例工程演示了如何使用Spring Boot + 动态Cron表达式 + Web界面来实现运营人员可自助调整任务时间的功能。通过这套方案,运营人员可以自主调整任务执行时间,提高了工作效率,同时也减轻了开发人员的负担。

在实际项目中,可以根据具体的业务场景进行调整和优化,如添加更多的任务管理功能、增强权限控制、集成监控告警等。

联系方式

  • 服务端技术精选:关注公众号,回复"动态任务调度",获取完整的代码示例和实现方案。
  • 个人技术博客:www.jiangyi.space


标题:SpringBoot + 动态 Cron 表达式 + Web 界面修改 示例工程
作者:jiangyi
地址:http://jiangyi.space/articles/2026/02/28/1772115102480.html
公众号:服务端技术精选
    评论
    0 评论
avatar

取消