您好,登录后才能下订单哦!
# SpringBoot2.6.3集成Quartz完整指南
## 一、Quartz框架概述
### 1.1 什么是Quartz
Quartz是一个开源的作业调度框架,由Java编写,能够创建简单或复杂的调度任务。它提供了以下核心功能:
- **任务调度**:支持按时间间隔、日历或特定时间点触发任务
- **持久化**:可将任务配置存储到数据库实现持久化
- **集群支持**:支持分布式环境下的任务调度
- **事务支持**:能与JTA事务集成
- **监听机制**:提供丰富的监听器接口
### 1.2 Quartz核心组件
| 组件 | 说明 |
|------|------|
| Scheduler | 调度器,任务调度的核心控制器 |
| Job | 任务接口,定义需要执行的工作 |
| JobDetail | 任务详情,包含Job的元数据 |
| Trigger | 触发器,定义任务执行的时间规则 |
| JobStore | 任务存储方式,支持内存或数据库 |
### 1.3 Quartz适用场景
- 定时数据同步
- 报表生成
- 系统监控
- 定时消息推送
- 数据清理任务
## 二、SpringBoot集成Quartz
### 2.1 环境准备
确保使用以下环境版本:
- JDK 1.8+
- SpringBoot 2.6.3
- Maven 3.6+
### 2.2 添加依赖
在`pom.xml`中添加Quartz相关依赖:
```xml
<!-- Quartz核心依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<!-- 如果需要持久化 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
在application.yml
中添加基本配置:
spring:
quartz:
job-store-type: memory # 使用内存存储
properties:
org:
quartz:
scheduler:
instanceName: clusteredScheduler
instanceId: AUTO
threadPool:
threadCount: 5
jobStore:
misfireThreshold: 60000
@Slf4j
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext context) {
JobDataMap dataMap = context.getJobDetail().getJobDataMap();
String param = dataMap.getString("param");
log.info("执行定时任务,参数: {}", param);
// 实际业务逻辑
try {
Thread.sleep(1000); // 模拟耗时操作
} catch (InterruptedException e) {
log.error("任务执行异常", e);
}
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob")
.usingJobData("param", "testValue")
.storeDurably()
.build();
}
@Bean
public Trigger sampleJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("sampleTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
创建任务管理服务:
@Service
public class QuartzJobService {
@Autowired
private Scheduler scheduler;
/**
* 创建定时任务
*/
public void createJob(String jobName, String jobGroup,
String triggerName, String triggerGroup,
Class<? extends Job> jobClass,
String cronExpression,
Map<String, Object> params) throws SchedulerException {
// 构建JobDetail
JobDetail jobDetail = JobBuilder.newJob(jobClass)
.withIdentity(jobName, jobGroup)
.usingJobData(new JobDataMap(params))
.build();
// 构建CronTrigger
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(triggerName, triggerGroup)
.withSchedule(CronScheduleBuilder.cronSchedule(cronExpression))
.build();
// 调度任务
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 暂停任务
*/
public void pauseJob(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.pauseJob(jobKey);
}
/**
* 恢复任务
*/
public void resumeJob(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.resumeJob(jobKey);
}
/**
* 删除任务
*/
public void deleteJob(String jobName, String jobGroup) throws SchedulerException {
JobKey jobKey = JobKey.jobKey(jobName, jobGroup);
scheduler.deleteJob(jobKey);
}
}
Quartz需要以下表结构,可从官方获取SQL脚本:
- qrtz_job_details
- qrtz_triggers
- qrtz_simple_triggers
- qrtz_cron_triggers
- qrtz_simprop_triggers
- qrtz_blob_triggers
- qrtz_calendars
- qrtz_paused_trigger_grps
- qrtz_fired_triggers
- qrtz_scheduler_state
- qrtz_locks
修改application.yml
:
spring:
quartz:
job-store-type: jdbc
jdbc:
initialize-schema: always # 首次启动自动建表
properties:
org:
quartz:
jobStore:
class: org.quartz.impl.jdbcjobstore.JobStoreTX
driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate
tablePrefix: QRTZ_
isClustered: true
clusterCheckinInterval: 20000
useProperties: false
threadPool:
class: org.quartz.simpl.SimpleThreadPool
threadCount: 10
在分布式环境下,Quartz集群需要以下配置:
spring:
quartz:
properties:
org:
quartz:
jobStore:
isClustered: true
scheduler:
instanceId: AUTO
public class JobListener implements org.quartz.JobListener {
@Override
public String getName() {
return "globalJobListener";
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
// 任务即将执行
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
// 任务被否决
}
@Override
public void jobWasExecuted(JobExecutionContext context,
JobExecutionException jobException) {
// 任务执行完成
}
}
// 注册监听器
@Bean
public SchedulerFactoryBeanCustomizer schedulerFactoryBeanCustomizer() {
return bean -> {
bean.setGlobalJobListeners(new JobListener());
};
}
public class RetryJob implements Job {
private static final int MAX_RETRY = 3;
@Override
public void execute(JobExecutionContext context) {
int retryCount = context.getRefireCount();
try {
// 业务逻辑
} catch (Exception e) {
if(retryCount < MAX_RETRY) {
JobExecutionException ex =
new JobExecutionException(e, true);
ex.setRefireImmediately(true);
throw ex;
}
// 记录最终失败
}
}
}
检查点: 1. 确保Scheduler已启动 2. 检查Trigger配置是否正确 3. 查看日志是否有异常
在集群环境下:
- 确保isClustered
设为true
- 检查数据库连接是否正常
- 确认instanceId
配置正确
提供GitHub仓库地址: https://github.com/example/springboot-quartz-demo
本文详细介绍了在SpringBoot 2.6.3中集成Quartz的完整流程,包括: - 基础集成配置 - 动态任务管理 - 持久化方案 - 集群部署 - 高级特性应用
通过合理使用Quartz,可以构建健壮、灵活的定时任务系统,满足企业级应用的需求。
”`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。