欢迎光临
我们一直在努力

Java 生产环境 Quartz 定时任务实战(完整版)

目录

一、Quartz 核心概念(生产必懂)

1. 三大核心组件

2. 运行模式(生产二选一)

3. Cron 表达式(生产常用规则)

二、SpringBoot 整合 Quartz(生产基础架构)

环境依赖(Maven)

步骤 1:初始化 Quartz 数据库表(生产第一步)

步骤 2:application.yml 生产配置(持久化 + 基础参数)

步骤 3:编写业务 Job(生产标准写法)

3.1 普通任务(允许并发)

3.2 禁止并发任务(生产高频:订单结算、库存盘点)

步骤 4:静态定时任务(项目启动即注册)

三、生产核心进阶:动态任务(后台新增 / 编辑 / 暂停 / 删除)

封装工具类(通用动态任务工具)

接口调用示例(Controller)

四、Quartz 集群高可用(生产重中之重)

1. 集群原理

2. 集群部署要求(必须遵守)

3. 集群故障演练(线上验证)

4. 集群常见问题

五、生产环境高频坑 & 解决方案

坑 1:任务执行时间过长,叠加触发(重复执行)

坑 2:服务重启后任务丢失

坑 3:服务优雅关闭失败,进程杀不掉

坑 4:Cron 表达式写错,任务不执行

坑 5:长任务阻塞线程池,所有定时都卡住

坑 6:集群下任务随机不执行

六、生产监控与运维(线上必备)

1. 日志规范

2. 监控指标(对接 Prometheus/ELK/ 告警)

3. Misfire(错失触发)策略(生产关键)

七、生产最佳实践总结

八、扩展:Quartz 与 XXL-Job 选型(生产参考)


本文基于 Quartz 2.x + Spring/SpringBoot,聚焦生产落地、避坑、高可用、运维、问题排查,从基础使用到集群、持久化、动态任务、监控逐一讲解,全部为线上通用方案。

一、Quartz 核心概念(生产必懂)

1. 三大核心组件

  • Job(任务) 业务逻辑载体,只定义「做什么」,无状态 / 有状态是生产高频坑点。
    • Job:单次执行任务接口
    • StatefulJob(旧)/ 注解 @DisallowConcurrentExecution:禁止并发执行同一个任务实例
  • Trigger(触发器) 定义「什么时候执行、执行频率」,分两类:
    • SimpleTrigger:固定间隔、固定次数(轮询、简单定时)
    • CronTrigger:Cron 表达式(生产最常用,复杂时间规则)
  • Scheduler(调度器) 总控制器,绑定 Job + Trigger,启动 / 暂停 / 停止调度,全局唯一。
  • 2. 运行模式(生产二选一)

    • 内存模式(RAMJobStore) 任务存在内存,重启服务全部丢失,单机临时任务使用,禁止生产核心定时。
    • 数据库持久化模式(JDBCJobStore) 任务、状态、执行记录落库,支持集群、故障转移、重启恢复,生产标准方案。

    3. Cron 表达式(生产常用规则)

    格式:秒 分 时 日 月 周 年(可选)

    * 每秒/每分
    ? 不指定(日/周互斥,只能一个写?)
    – 范围
    , 枚举
    / 步长
    L 最后一天
    W 工作日
    # 第几个星期

    生产常用示例:

    0 0/5 * * * ? 每5分钟执行
    0 30 1 * * ? 每天凌晨1:30执行
    0 0 2 * * ? 每天凌晨2点执行(数据同步、报表)
    0 0 18 ? * MON-FRI 工作日每天18点执行


    二、SpringBoot 整合 Quartz(生产基础架构)

    环境依赖(Maven)

    <!– SpringBoot 整合 Quartz 官方 starter –>
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <!– 数据库(持久化必备) –>
    <dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    </dependency>
    <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    </dependency>

    步骤 1:初始化 Quartz 数据库表(生产第一步)

    持久化模式必须先执行官方建表语句,不同数据库脚本在 quartz.jar 包内: org/quartz/impl/jdbcjobstore/tables_xxx.sql

    MySQL 表清单(核心表):

    • qrtz_job_details:任务详情
    • qrtz_triggers:触发器
    • qrtz_cron_triggers:Cron 触发器配置
    • qrtz_scheduler_state:集群节点状态
    • qrtz_locks:分布式锁(集群防并发)

    线上建议:单独库 / 单独表空间,和业务库解耦。

    步骤 2:application.yml 生产配置(持久化 + 基础参数)

    spring:
    # 数据源(Quartz 复用业务数据源,也可单独配置)
    datasource:
    druid:
    url: jdbc:mysql://127.0.0.1:3306/quartz_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&allowMultiQueries=true
    username: root
    password: xxx
    driver-class-name: com.mysql.cj.jdbc.Driver

    # Quartz 生产核心配置
    quartz:
    # 任务持久化:jdbc=数据库 memory=内存
    job-store-type: jdbc
    # 应用启动时,是否初始化表(生产关闭!只首次部署开一次)
    jdbc:
    initialize-schema: never
    # 关闭自动启动(部分场景需要手动控制调度器)
    auto-startup: true
    # 定时任务线程池配置(根据业务压测调参)
    thread-pool:
    thread-name-prefix: quartz-task-
    thread-count: 10 # 并发任务最大数,生产根据QPS设置
    # 原生 Quartz 底层配置(重点)
    properties:
    org:
    quartz:
    # 调度器实例名称(集群所有节点必须一致)
    scheduler:
    instanceName: quartz-cluster-scheduler
    # 集群开关:true=开启集群(高可用必备)
    instanceId: AUTO # 自动生成节点ID,集群推荐
    # 数据库存储配置
    jobStore:
    class: org.quartz.impl.jdbcjobstore.JobStoreTX
    driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    tablePrefix: QRTZ_ # 表前缀,和建表语句一致
    useProperties: false
    # 集群核心配置
    clusterCheckinInterval: 10000 # 节点心跳间隔(ms)
    isClustered: true # 开启集群
    # 线程池
    threadPool:
    class: org.quartz.simpl.SimpleThreadPool
    makeThreadsDaemons: true # 守护线程,不阻止服务优雅关闭

    配置说明(生产关键点)

  • initialize-schema: never:生产绝对关闭,重复执行会清空任务数据。
  • thread-count:定时任务并发数,过大抢资源,过小任务阻塞。
  • isClustered: true:集群高可用核心,多节点自动故障转移。
  • makeThreadsDaemons: true:优雅停机必备。
  • 步骤 3:编写业务 Job(生产标准写法)

    3.1 普通任务(允许并发)

    i

    赞(0)
    未经允许不得转载:171主机测评 » Java 生产环境 Quartz 定时任务实战(完整版)
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址