一、引言
常见的定时任务框架有 Quartz、elastic-job、xxl-job等等,本文主要介绍 Spirng Boot 集成 Quartz 定时任务框架。
二、Quartz 简介
Quartz 是一个功能强大且灵活的开源作业调度库,广泛用于 Java 应用中。它允许开发者创建复杂的调度任务,包括简单的周期性任务和复杂的日程安排。Quartz 支持多种类型的任务调度,包括按时间间隔、特定时间点、日历时间和其他复杂的时间表达式。
主要特性:
- 丰富的调度表达式:支持 Cron 表达式,可以非常灵活地定义任务的调度时间。
- 持久化支持:Quartz 支持将调度任务存储到数据库中,以保证任务在应用重启后能够继续执行。
- 集群支持:Quartz 可以在集群环境中运行,提供高可用性和负载均衡功能。
- 多种触发器:支持多种触发器,包括简单触发器、Cron触发器等。
- 任务监听器:支持任务的监听器,能够在任务执行前后执行一些额外操作。
二、在 Spring Boot 中集成 Quartz
在 Spring Boot 中集成 Quartz 非常简单,Spring 提供了对 Quartz 的良好支持。以下是一个简单的例子,展示如何在 Spring Boot 项目中使用 Quartz。
步骤 1: 添加依赖
pom.xml 文件中添加以下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
步骤 2: 创建一个任务
定义一个简单的 Quartz 任务类:
package com.example.demo;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.stereotype.Component;
@Component
public class SampleJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("Executing Sample Job at " + System.currentTimeMillis());
}
}
步骤 3: 配置 Quartz
在 Spring Boot 中配置 Quartz 调度器。可以在 application.properties 或 application.yml 文件中进行配置,也可以通过代码配置。
# 指定Quartz使用的作业存储类型为内存(RAMJobStore),这意味着所有的作业和触发器信息都将存储在内存中。
# 这种方式的存取速度较快,但在系统重启后,所有数据将会丢失,因此它不适合需要持久化作业信息的集群环境。
spring.quartz.job-store-type=memory
# 设置Quartz Scheduler的名称,用于区分不同的Scheduler实例。
spring.quartz.scheduler-name=SampleScheduler
# 配置当应用启动时,如果检测到已存在的作业(job)与配置的作业相同,则允许覆盖它们。
# 这可以避免在修改作业后需要手动删除数据库中的相关记录。
spring.quartz.overwrite-existing-jobs=true
# 配置Quartz线程池的线程数量,这里设置为5
spring.quartz.properties.org.quartz.threadPool.threadCount=5
步骤 4: 创建作业详情和触发器
通过 Java 配置类创建调度任务:
package com.example.demo;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// 这是一个Spring配置类,用于定义Quartz的JobDetail和Trigger
@Configuration
public class QuartzConfig {
// 定义一个Bean,用于创建JobDetail实例
// JobDetail描述了Quartz要执行的具体任务
@Bean
public JobDetail sampleJobDetail() {
// 使用JobBuilder来构建一个JobDetail实例
// newJob(SampleJob.class)指定了实际要执行的Job类为SampleJob
// withIdentity("sampleJob")为这个JobDetail设置了一个唯一标识符
// storeDurably()使得JobDetail即使在没有Trigger关联的情况下也能被存储
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob")
.storeDurably()
.build(); // 构建并返回JobDetail实例
}
// 定义一个Bean,用于创建Trigger实例(触发器)
// Trigger描述了JobDetail的执行计划,即何时开始执行、执行的频率等
@Bean
public Trigger sampleJobTrigger() {
// 使用SimpleScheduleBuilder来构建一个简单的调度计划
// withIntervalInSeconds(10)设置了任务执行的间隔为10秒
// repeatForever()表示任务将无限次重复执行
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10)
.repeatForever();
// 使用TriggerBuilder来构建Trigger实例
// forJob(sampleJobDetail())指定了Trigger关联的JobDetail为之前定义的sampleJobDetail
// withIdentity("sampleTrigger")为这个Trigger设置了一个唯一标识符
// withSchedule(scheduleBuilder)设置了之前定义的调度计划
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail()) // 注意这里通常使用JobDetail的引用而不是方法调用,但在这个例子里也可以
.withIdentity("sampleTrigger")
.withSchedule(scheduleBuilder)
.build(); // 构建并返回Trigger实例
}
}
步骤 5: 启动应用
启动 Spring Boot 应用程序,Quartz 调度器会自动启动,并按照配置的调度策略执行任务。
三、持久化配置
- 在 application.properties 文件中加入 Quartz 相关配置。
# 将 Quartz 持久化方式修改为 jdbc
spring.quartz.job-store-type=jdbc
# 实例名称(默认为quartzScheduler)
spring.quartz.properties.org.quartz.scheduler.instanceName=SC_Scheduler
# 实例节点 ID 自动生成
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
# 修改存储内容使用的类
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
# 数据源信息
spring.quartz.properties.org.quartz.jobStore.dataSource=quartz_jobs
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.driver=com.mysql.cj.jdbc.Driver
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.URL=jdbc:mysql://127.0.0.1:3306/quartz_jobs?serverTimezone=UTC&useUnicode=true&characterEncoding=UTF-8
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.user=root
spring.quartz.properties.org.quartz.dataSource.quartz_jobs.password=123456
- 初始化 Quartz 数据表信息
下载 Quartz 发布包,下载完成后,解压缩进入 quartz-2.2.3/docs/dbTables 目录,找到匹配数据库的 SQL 文件
下载地址:
https://www.quartz-scheduler.org/downloads/files/quartz-2.2.3-distribution.tar.gz
然后在数据库中执行 tables-mysql.sql
初始化脚本。
四、总结
通过以上步骤,可以在 Spring Boot 应用中成功集成并使用 Quartz 来进行任务调度。Quartz 的强大之处在于其灵活性和可扩展性,能够满足各种复杂的任务调度需求。在实际应用中,可以根据具体需求配置更多的 Quartz 特性,如持久化、集群等。
- 在生产环境中,需要配置 Quartz 的持久化选项,以便在应用程序重启后仍然可以恢复调度任务的状态。
- 可以使用 @Autowired 将 Scheduler 注入到你的服务或组件中,以动态地添加、删除或更新作业和触发器。
- Quartz 还提供了很多其他的功能和选项,如监听器、插件、作业恢复等