拿来即用的企业级springboot整合quartz定时任务框架
本项目是二次开发(原作者找不到了,在此表示感谢),最近在做架构升级初次接触到quartz这个定时任务框架,想要实现的效果就是springboot整合quartz实现定时的统一管理。 在网上找了很多资料和项目,他们道理讲的很明白,但是给的例子只是简单的demo,用来自己学习玩玩还行,无法应用到实际的生产项目中。 于是经过我的一番摸索,把看到的项目整合在一起,做一个
拿来即用的企业级springboot整合quartz定时任务框架。
- ✅ 通过 XML 配置文件预定义定时任务,启动即自动执行
- ✅ 通过 REST API 动态管理定时任务(新增、暂停、恢复、重启、删除、分页查询)
- ✅ 使用数据库持久化任务调度信息,任务状态在应用重启后不丢失
- ✅ 使用 Druid 数据库连接池替代 Quartz 默认连接池
- ✅ 支持动态指定 Job 类(API 动态添加任务时可指定不同的 Job 实现)
- ✅ 支持环境变量配置数据库(生产部署更安全)
- ✅ 全局异常处理,统一错误响应格式
git clone https://github.com/fmz200/springboot-quartz.git在 MySQL 中执行 src/main/resources/tables_mysql.sql 文件,创建所需的表:
mysql -u root -p < src/main/resources/tables_mysql.sql方式一:直接修改配置文件(开发环境)
修改 application.properties 和 quartz_data.properties 中的数据库配置:
# application.properties
spring.datasource.druid.url=jdbc:mysql://localhost:3306/test_quartz?characterEncoding=utf8&useSSL=false&autoReconnect=true&serverTimezone=UTC
spring.datasource.druid.username=root
spring.datasource.druid.password=your_password方式二:使用环境变量(生产环境推荐)
export DB_HOST=192.168.1.100
export DB_PORT=3306
export DB_NAME=test_quartz
export DB_USER=quartz_user
export DB_PASS=secure_password
java -jar springboot-quartz.jarmvn spring-boot:run启动后即可看到定时任务已经在执行。
项目提供以下 REST API 接口(端口默认 8089):
| 方法 | 路径 | 功能 | 参数 |
|---|---|---|---|
| POST | /quartz/addjob |
新增定时任务 | jName, jGroup, tName, tGroup, cron, jobClassName |
| POST | /quartz/pausejob |
暂停任务 | jName, jGroup |
| POST | /quartz/resumejob |
恢复任务 | jName, jGroup |
| POST | /quartz/reschedulejob |
重启任务(修改cron) | jName, jGroup, cron |
| POST | /quartz/deletejob |
删除任务 | jName, jGroup |
| GET | /quartz/queryjob |
分页查询任务列表 | pageNum, pageSize |
1. 新增定时任务
curl -X POST "http://localhost:8089/quartz/addjob" \
-d "jName=myJob" \
-d "jGroup=DEFAULT" \
-d "tName=myTrigger" \
-d "tGroup=DEFAULT" \
-d "cron=0/5 * * * * ?" \
-d "jobClassName=org.example.job.HelloJob"2. 暂停任务
curl -X POST "http://localhost:8089/quartz/pausejob" \
-d "jName=myJob" \
-d "jGroup=DEFAULT"3. 恢复任务
curl -X POST "http://localhost:8089/quartz/resumejob" \
-d "jName=myJob" \
-d "jGroup=DEFAULT"4. 修改任务 Cron 表达式
curl -X POST "http://localhost:8089/quartz/reschedulejob" \
-d "jName=myJob" \
-d "jGroup=DEFAULT" \
-d "cron=0/10 * * * * ?"5. 删除任务
curl -X POST "http://localhost:8089/quartz/deletejob" \
-d "jName=myJob" \
-d "jGroup=DEFAULT"6. 查询任务列表(分页)
curl "http://localhost:8089/quartz/queryjob?pageNum=1&pageSize=10"在 org.example.job 包下新建一个类,实现 org.quartz.Job 接口:
package org.example.job;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import cn.hutool.core.date.DateUtil;
@Slf4j
public class MyCustomJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
// 获取 JobDataMap 中的参数
String param = context.getMergedJobDataMap().getString("param");
// 执行你的业务逻辑
log.info("MyCustomJob 执行时间: {}", DateUtil.now());
log.info("参数: {}", param);
}
}方式一:通过 XML 配置(启动自动执行)
在 src/main/resources/quartz_data.xml 的 <schedule> 标签内添加:
<job>
<name>MyCustomJob</name>
<group>CustomGroup</group>
<job-class>org.example.job.MyCustomJob</job-class>
<job-data-map>
<entry>
<key>param</key>
<value>hello world</value>
</entry>
</job-data-map>
</job>
<trigger>
<cron>
<name>MyCustomJobTrigger</name>
<group>CustomGroup</group>
<job-name>MyCustomJob</job-name>
<job-group>CustomGroup</job-group>
<cron-expression>0 0/30 * * * ?</cron-expression>
</cron>
</trigger>方式二:通过 API 动态添加
curl -X POST "http://localhost:8089/quartz/addjob" \
-d "jName=MyCustomJob" \
-d "jGroup=CustomGroup" \
-d "tName=MyCustomJobTrigger" \
-d "tGroup=CustomGroup" \
-d "cron=0 0/30 * * * ?" \
-d "jobClassName=org.example.job.MyCustomJob"src/main/
java/org/example/
├── QuartzApplication.java # 启动类
├── config/
│ ├── QuartzConfig.java # Quartz 核心配置
│ └── DruidPoolingconnectionProvider.java # Druid 连接池配置
├── controller/
│ └── QuartzController.java # REST API 控制器
├── service/
│ └── QuartzService.java # 服务接口
├── serviceImpl/
│ └── QuartzServiceImpl.java # 服务实现
├── job/
│ ├── HelloJob.java # 示例任务1
│ └── SimpleJob.java # 示例任务2
├── mapper/
│ ├── JobDetailMapper.java # 任务详情 Mapper
│ ├── TriggerMapper.java # 触发器 Mapper
│ └── CronTriggerMapper.java # Cron 触发器 Mapper
├── pojo/ # 实体类
├── dto/ # 数据传输对象
├── vo/ # 视图对象
├── util/
│ └── SpringUtil.java # Spring 上下文工具
└── exception/
└── GlobalExceptionHandler.java # 全局异常处理器
resources/
├── mapper/ # Mapper XML 文件
│ ├── JobDetailMapper.xml
│ ├── TriggerMapper.xml
│ └── CronTriggerMapper.xml
├── application.properties # Spring Boot 配置
├── quartz_data.properties # Quartz 配置
├── quartz_data.xml # 预定义任务配置
└── tables_mysql.sql # 数据库建表脚本
| 环境变量 | 说明 | 默认值 |
|---|---|---|
DB_HOST |
数据库主机 | localhost |
DB_PORT |
数据库端口 | 3306 |
DB_NAME |
数据库名称 | test_quartz |
DB_USER |
数据库用户名 | root |
DB_PASS |
数据库密码 | root1234 |
| 配置项 | 说明 | 默认值 |
|---|---|---|
org.quartz.scheduler.instanceName |
调度器名称 | MyQuartzScheduler |
org.quartz.threadPool.threadCount |
线程池大小 | 5 |
org.quartz.jobStore.misfireThreshold |
Misfire 阈值(ms) | 5000 |
Active Scheduler of name 'MyScheduler' already registered in Quartz SchedulerRepository
原因: 自定义 quartz 配置文件不能命名为 quartz.properties(会和 Quartz 内置冲突),instanceName 不能为 DefaultQuartzScheduler。
解决: 项目已将配置文件命名为 quartz_data.properties,instanceName 设置为 MyQuartzScheduler,无需修改。
Could not create connection to database server
原因: MySQL connector 或 Druid 版本过低。
解决: 项目已使用最新版本(mysql-connector-java 8.0.28,druid-spring-boot-starter 1.2.6),如仍有问题请检查数据库服务是否正常。
'url' attribute is not specified and no embedded datasource could be configured
原因: resources 目录未被 IDE 标记为"资源根目录"。
解决: 在 IntelliJ IDEA 中,右键 src/main/resources → Mark Directory as → Resources Root。
原因: quartz_data.xml 中的 pre-processing-commands 配置会在启动时清空所有任务。
解决: 项目已移除此配置,API 添加的任务在重启后会保留。如需在开发环境清空任务,可临时取消注释 quartz_data.xml 中的相关配置。
- ✅ 修复 addjob 接口硬编码 HelloJob.class 的问题,现在支持动态指定 Job 类
- ✅ 移除 quartz_data.xml 中的 pre-processing-commands,避免启动时清空 API 动态添加的任务
- ✅ 统一 Druid 依赖版本,移除冲突的 druid 1.1.12
- ✅ 添加全局异常处理器(GlobalExceptionHandler)
- ✅ 将 Mapper XML 文件移到 resources/mapper 目录(更规范)
- ✅ 添加 @MapperScan 注解,确保所有 Mapper 被扫描到
- ✅ 数据库配置支持环境变量(生产部署更安全)
- 初始版本
MIT License