Skip to content

fmz200/springboot-quartz

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

springboot-quartz

拿来即用的企业级springboot整合quartz定时任务框架

本项目是二次开发(原作者找不到了,在此表示感谢),最近在做架构升级初次接触到quartz这个定时任务框架,想要实现的效果就是springboot整合quartz实现定时的统一管理。 在网上找了很多资料和项目,他们道理讲的很明白,但是给的例子只是简单的demo,用来自己学习玩玩还行,无法应用到实际的生产项目中。 于是经过我的一番摸索,把看到的项目整合在一起,做一个拿来即用的企业级springboot整合quartz定时任务框架

✨ 项目特性

  • ✅ 通过 XML 配置文件预定义定时任务,启动即自动执行
  • ✅ 通过 REST API 动态管理定时任务(新增、暂停、恢复、重启、删除、分页查询)
  • ✅ 使用数据库持久化任务调度信息,任务状态在应用重启后不丢失
  • ✅ 使用 Druid 数据库连接池替代 Quartz 默认连接池
  • ✅ 支持动态指定 Job 类(API 动态添加任务时可指定不同的 Job 实现)
  • ✅ 支持环境变量配置数据库(生产部署更安全)
  • ✅ 全局异常处理,统一错误响应格式

🚀 快速开始

1、下载项目

git clone https://github.com/fmz200/springboot-quartz.git

2、数据库准备

在 MySQL 中执行 src/main/resources/tables_mysql.sql 文件,创建所需的表:

mysql -u root -p < src/main/resources/tables_mysql.sql

3、配置数据库连接

方式一:直接修改配置文件(开发环境)

修改 application.propertiesquartz_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.jar

4、启动项目

mvn spring-boot:run

启动后即可看到定时任务已经在执行。


📡 REST API 接口

项目提供以下 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

API 调用示例

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"

🛠️ 如何添加新的定时任务

步骤1:创建 Job 类

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);
    }
}

步骤2:配置定时任务(二选一)

方式一:通过 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

Quartz 配置(quartz_data.properties)

配置项 说明 默认值
org.quartz.scheduler.instanceName 调度器名称 MyQuartzScheduler
org.quartz.threadPool.threadCount 线程池大小 5
org.quartz.jobStore.misfireThreshold Misfire 阈值(ms) 5000

❓ 常见问题

1、调度器名称冲突

Active Scheduler of name 'MyScheduler' already registered in Quartz SchedulerRepository

原因: 自定义 quartz 配置文件不能命名为 quartz.properties(会和 Quartz 内置冲突),instanceName 不能为 DefaultQuartzScheduler

解决: 项目已将配置文件命名为 quartz_data.propertiesinstanceName 设置为 MyQuartzScheduler,无需修改。

2、数据库连接失败

Could not create connection to database server

原因: MySQL connector 或 Druid 版本过低。

解决: 项目已使用最新版本(mysql-connector-java 8.0.28,druid-spring-boot-starter 1.2.6),如仍有问题请检查数据库服务是否正常。

3、DataSource 未配置

'url' attribute is not specified and no embedded datasource could be configured

原因: resources 目录未被 IDE 标记为"资源根目录"。

解决: 在 IntelliJ IDEA 中,右键 src/main/resourcesMark Directory asResources Root

4、API 添加的任务重启后丢失

原因: quartz_data.xml 中的 pre-processing-commands 配置会在启动时清空所有任务。

解决: 项目已移除此配置,API 添加的任务在重启后会保留。如需在开发环境清空任务,可临时取消注释 quartz_data.xml 中的相关配置。


📝 更新日志

v2.0 (优化版)

  • ✅ 修复 addjob 接口硬编码 HelloJob.class 的问题,现在支持动态指定 Job 类
  • ✅ 移除 quartz_data.xml 中的 pre-processing-commands,避免启动时清空 API 动态添加的任务
  • ✅ 统一 Druid 依赖版本,移除冲突的 druid 1.1.12
  • ✅ 添加全局异常处理器(GlobalExceptionHandler)
  • ✅ 将 Mapper XML 文件移到 resources/mapper 目录(更规范)
  • ✅ 添加 @MapperScan 注解,确保所有 Mapper 被扫描到
  • ✅ 数据库配置支持环境变量(生产部署更安全)

v1.0

  • 初始版本

📄 License

MIT License

About

拿来即用的企业级springboot整合quartz定时任务框架

Resources

Stars

1 star

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages