Quartz基础入门
2025/8/15大约 4 分钟
Quartz基础入门
前置知识
在开始本教程之前,建议您具备以下基础知识:
- Java基础语法
- Maven或Gradle构建工具
- Spring框架基础
- 多线程编程基础
什么是Quartz?
Quartz是一个功能丰富的开源作业调度框架,可以用来创建简单或复杂的任务调度。它的主要特点:
- 灵活的调度:支持多种调度方式(如:简单、CRON表达式等)
- 持久性:支持将作业和触发器存储在数据库中
- 集群:支持分布式环境和故障转移
- 可扩展:提供插件式的API设计
核心概念
1. 基本组件
Quartz的核心组件包括:
- Job(作业):要执行的任务
- JobDetail(作业详情):任务的定义
- Trigger(触发器):任务的触发规则
- Scheduler(调度器):协调任务和触发器
2. 组件关系
Scheduler
├── JobDetail
│ └── Job
└── Trigger
环境准备
1. 添加依赖
<dependencies>
<!-- Quartz核心依赖 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.2</version>
</dependency>
<!-- Spring集成Quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
2. 基础配置
# application.yml
spring:
quartz:
job-store-type: memory # 使用内存存储
auto-startup: true # 自动启动调度器
startup-delay: 0 # 启动延迟
wait-for-jobs-to-complete-on-shutdown: true # 等待任务完成
快速开始
完整示例代码
@Slf4j
public class SimpleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
log.info("Simple job is running at: {}", LocalDateTime.now());
}
}
@Configuration
public class QuartzConfig {
@Bean
public JobDetail simpleJobDetail() {
return JobBuilder.newJob(SimpleJob.class)
.withIdentity("simpleJob")
.storeDurably()
.build();
}
@Bean
public Trigger simpleTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(simpleJobDetail())
.withIdentity("simpleTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
## 触发器类型
### 1. Simple触发器
适用于简单的重复执行场景:
```java
SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10) // 每10秒执行一次
.withRepeatCount(5) // 重复5次
.build();
2. Cron触发器
适用于复杂的定时执行场景:
CronScheduleBuilder.cronSchedule("0 0/5 * * * ?")
.build(); // 每5分钟执行一次
Cron表达式
常用格式说明:
0 0 12 * * ?
- 每天中午12点0 15 10 ? * *
- 每天10:150 15 10 * * ? 2023
- 2023年每天10:150 0/5 * * * ?
- 每5分钟
作业数据
1. JobDataMap使用
@Slf4j
public class DataJob implements Job {
private String message;
public void setMessage(String message) {
this.message = message;
}
@Override
public void execute(JobExecutionContext context) {
log.info("Message from JobDataMap: {}", message);
}
}
// 配置JobDetail时设置数据
JobDetail jobDetail = JobBuilder.newJob(DataJob.class)
.withIdentity("dataJob")
.usingJobData("message", "Hello from JobDataMap!")
.build();
2. 共享数据
@Slf4j
public class SharedDataJob implements Job {
@Override
public void execute(JobExecutionContext context) {
// 获取调度器上下文
SchedulerContext schedulerContext = null;
try {
schedulerContext = context.getScheduler().getContext();
String sharedData = (String) schedulerContext.get("sharedData");
log.info("Shared data: {}", sharedData);
} catch (SchedulerException e) {
log.error("Error getting scheduler context", e);
}
}
}
监听器
1. 作业监听器
监听器示例代码
@Slf4j
public class SimpleJobListener implements JobListener {
@Override
public String getName() {
return "simpleJobListener";
}
@Override
public void jobToBeExecuted(JobExecutionContext context) {
log.info("Job is about to be executed");
}
@Override
public void jobExecutionVetoed(JobExecutionContext context) {
log.info("Job execution was vetoed");
}
@Override
public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
log.info("Job was executed");
}
}
## 异常处理
### 1. 基本异常处理
::: details 异常处理示例代码
```java
@Slf4j
public class ErrorHandlingJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
try {
// 执行可能抛出异常的任务
riskyOperation();
} catch (Exception e) {
log.error("Job execution failed", e);
JobExecutionException jobException = new JobExecutionException(e);
jobException.setRefireImmediately(true); // 立即重新执行
// 或者
// jobException.unscheduleAllTriggers(true); // 取消所有触发器
throw jobException;
}
}
private void riskyOperation() {
// 模拟可能失败的操作
}
}
:::
## 最佳实践
### 1. 命名规范
::: tip 建议
1. Job名称使用有意义的业务名称
2. 触发器名称与Job关联
3. 使用组名进行分类管理
:::
### 2. 异常处理
::: warning 注意事项
1. 合理使用重试机制
2. 记录详细的错误日志
3. 考虑发送告警通知
:::
### 3. 性能优化
::: tip 优化建议
1. 合理设置线程池大小
2. 避免长时间运行的任务
3. 使用批处理减少执行次数
:::
## 总结
本文详细介绍了Quartz的:
1. ✅ 核心概念和组件
2. ✅ 基本配置和使用
3. ✅ 触发器类型选择
4. ✅ 数据传递方式
5. ✅ 监听器和异常处理
::: info 下一步学习
- 深入了解Quartz的任务调度机制
- 学习持久化存储配置
- 掌握集群环境部署
:::
希望这篇文章能帮助您快速入门Quartz!如果您有任何问题,欢迎在评论区讨论。