目录

传统的单体应用中,可以使用简单的定时任务框架,但在分布式环境下,需要确保定时任务不会重复执行。
简介
Quartz 是Java定时任务领域的开源框架,由OpenSymphony组织开发,支持复杂任务调度。核心组件包括:
- Job:定义任务逻辑的接口
- Trigger:控制执行时间的触发器
- Scheduler:任务调度容器
支持Cron表达式和SpringBoot集成,
存储模式
RAMJobStore:内存存储,性能高但不支持集群
JDBCJobStore:数据库存储,支持集群和持久化
<!-- Spring Boot Quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
简单使用
启动类注解
@EnableScheduling
TestTask
package com.core.demo.job;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
/**
* ceshi
*
* @author admin
* @date 2026/1/8 23:09
*/
@Component
public class TestTask {
@Scheduled(cron = "0/5 * * * * ?") // 每5秒执行一次
public void scheduledTask() {
System.out.println("定时任务执行中...");
}
}

集群模式
yml配置文件
spring:
quartz:
# memory, jdbc
job-store-type: jdbc
jdbc:
# always 每次启动都初始化脚本,
# never 从来都不。
initialize-schema: never
# 初始化脚本, 与always合用,使用jar包内置的脚本,或者自己定义
# schema:
# - classpath: org/quartz/impl/jdbcjobstore/tables_mysql_innodb.sql
properties:
org:
quartz:
scheduler:
instanceId: AUTO
instanceName: Scheduler
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 表前缀
tablePrefix: qrtz_
# 启用集群模式,确保多个实例间任务调度的一致性
isClustered: true
# 集群检查间隔时间(单位:毫秒)
clusterCheckinInterval: 20000
useProperties: true
# 引用Spring Boot自动配置的数据源:default
dataSource: jobDb
dataSource:
jobDb:
driver: com.mysql.cj.jdbc.Driver
URL: jdbc:mysql://127.0.0.1:3306/yscloud?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useInformationSchema=true
user: root
password: 123456
maxConnections: 10
acquireIncrement: 1
在\org\quartz-scheduler\quartz\2.3.1\quartz-2.3.1.jar!\org\quartz\impl\jdbcjobstore 下有各种sql脚本,这里选择tables_mysql_innodb.sql

TestTask
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.springframework.stereotype.Component;
/**
* ceshi
*
* @author admin
* @date 2026/1/8 23:09
*/
@Component
@Slf4j
public class TestTask implements Job {
@Override
public void execute(JobExecutionContext context) {
log.info("每日任务执行 - {}", System.currentTimeMillis());
}
}
SchedulerConfig
import com.core.demo.job.TestTask;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author admin
* @date 2026/1/11 20:18
*/
@Configuration
public class SchedulerConfig {
@Bean
public JobDetail dailyJobDetail() {
return JobBuilder.newJob(TestTask.class)
.withIdentity("testTask", "default")
.storeDurably(true)
.build();
}
@Bean
public Trigger dailyJobTrigger() {
// 每5秒执行一次
return TriggerBuilder.newTrigger()
.forJob(dailyJobDetail())
.withIdentity("dailyJobTrigger", "default")
.withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * * * ?"))
.build();
}
}
