Quartz 是一个开源的任务调度框架,用于在应用程序中创建、管理和调度定时任务。将 Quartz 和 Spring Boot 3 结合,可以轻松实现定时任务的灵活管理。本文将详细介绍如何在 Spring Boot 3 项目中集成 Quartz Scheduler 并实现示例任务的调度。
Quartz 是 Java 平台下的一个强大、灵活的调度库,它支持复杂的任务调度,包括:
可以使用 Spring Initializr 创建项目,选择以下依赖:
如果使用的是手动创建的项目,可以在 pom.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-web</artifactId>
</dependency>
在 application.yml
或 application.properties
文件中配置 Quartz 的基本属性,例如任务存储和调度方式。
以下是 application.yml
配置示例:
spring:
application:
name: spring-boot3-19-quartz
quartz:
job-store-type: memory # 储类型为内存存储
properties:
org:
quartz:
threadPool:
threadCount: 5 # 配置线程池线程数为 5
jobStore:
misfireThreshold: 60000 # 设置作业存储的错过触发阈值为 60000 毫秒(1分钟)
这里使用了内存存储方式(job-store-type: memory
),也可以根据需要配置数据库存储任务信息。
创建一个简单的 Quartz 任务类,需要实现 Job
接口,并重写 execute
方法:
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class SampleJob implements Job {
private static final Logger logger = LoggerFactory.getLogger(SampleJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
logger.info("Executing Sample Job at: " + context.getFireTime());
}
}
在 Spring Boot 3 中,可以通过 @Configuration
创建 Quartz 的调度器,并配置定时任务的触发器(Trigger)和任务详情(JobDetail)。
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;
@Configuration
public class QuartzConfig {
@Bean
public JobDetail sampleJobDetail() {
return JobBuilder.newJob(SampleJob.class)
.withIdentity("sampleJob")
.storeDurably()
.build();
}
@Bean
public Trigger sampleJobTrigger() {
SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(10) // 每 10 秒执行一次
.repeatForever();
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("sampleJobTrigger")
.withSchedule(scheduleBuilder)
.build();
}
}
sampleJobDetail
方法定义了任务的基本信息,包括任务类和名称。sampleJobTrigger
方法定义了触发器的调度策略,这里设置为每 10 秒执行一次。除了简单的时间间隔,还可以通过 Cron 表达式实现更灵活的调度。以下示例展示如何使用 Cron 表达式配置任务触发器。
import org.quartz.CronScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
@Bean
public Trigger cronJobTrigger() {
return TriggerBuilder.newTrigger()
.forJob(sampleJobDetail())
.withIdentity("cronJobTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0/1 * 1/1 * ? *")) // 每分钟执行一次
.build();
}
在这个例子中,Cron 表达式 "0 0/1 * 1/1 * ? *"
表示每分钟执行一次任务。
配置完成后,启动 Spring Boot 应用。Quartz Scheduler 会按照配置执行 SampleJob
任务。您可以在控制台中看到日志输出,类似如下:
2024-11-13T21:07:39.910+08:00 INFO 11984 --- [spring-boot3-18-quartz] [eduler_Worker-4] c.coderjia.boot318quartz.job.SampleJob : Executing Sample Job at: Wed Nov 13 21:07:39 CST 2024
每 10 秒执行一次效果:
每分钟执行一次效果:
可以在代码中动态地添加、暂停、恢复和删除任务。例如,以下是动态添加任务的示例:
package com.coderjia.boot318quartz;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author CoderJia
* @create 2024/11/13 下午 09:25
* @Description
**/
@Service
public class QuartzService {
private final Scheduler scheduler;
@Autowired
public QuartzService(Scheduler scheduler) {
this.scheduler = scheduler;
}
public void scheduleJob(JobDetail jobDetail, Trigger trigger) {
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
e.printStackTrace();
}
}
public void pauseJob(String jobName, String jobGroup) {
try {
JobKey jobKey = new JobKey(jobName, jobGroup);
scheduler.pauseJob(jobKey);
System.out.println("Job paused: " + jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public void resumeJob(String jobName, String jobGroup) {
try {
JobKey jobKey = new JobKey(jobName, jobGroup);
scheduler.resumeJob(jobKey);
System.out.println("Job resumed: " + jobKey);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public void deleteJob(String jobName, String jobGroup) {
try {
JobKey jobKey = new JobKey(jobName, jobGroup);
boolean deleted = scheduler.deleteJob(jobKey);
if (deleted) {
System.out.println("Job deleted: " + jobKey);
} else {
System.out.println("Job not found: " + jobKey);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
调用 scheduleJob
方法可以动态地添加新的任务。类似地,使用 scheduler.pauseJob()
和 scheduler.deleteJob()
可以暂停或删除任务。
通过将 Quartz 与 Spring Boot 3 结合,我们可以实现强大而灵活的定时任务调度系统。本文介绍了 Quartz 的基本配置和使用方法,包括如何配置任务、触发器,以及使用 Cron 表达式实现复杂的调度策略。