在 Spring 中集成 Quartz 可实现复杂的任务调度,下面以 Spring Boot 项目为例,详细介绍集成步骤与示例代码。
1. 添加依赖
在 pom.xml
中添加 Spring Boot 和 Quartz 的依赖:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
</dependencies>
2. 创建任务类
创建一个实现 Job
接口的任务类,在 execute
方法中编写具体的任务逻辑。
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalDateTime;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("任务执行时间: " + LocalDateTime.now());
}
}
3. 配置 Quartz 任务和触发器
创建一个配置类,用于配置 Quartz 的任务和触发器。
import org.quartz.JobDetail;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(MyJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean triggerFactory = new SimpleTriggerFactoryBean();
triggerFactory.setJobDetail(jobDetail);
triggerFactory.setStartDelay(1000); // 延迟 1 秒开始执行
triggerFactory.setRepeatInterval(5000); // 每 5 秒执行一次
triggerFactory.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
return triggerFactory;
}
}
4. 启动 Spring Boot 应用
创建 Spring Boot 主类并启动应用。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuartzIntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzIntegrationApplication.class, args);
}
}
代码解释
- 任务类:
MyJob
类实现了Job
接口,在execute
方法中定义了具体的任务逻辑,这里只是简单地打印当前时间。 - 配置类:
QuartzConfig
类使用@Configuration
注解,定义了JobDetail
和Trigger
。JobDetailFactoryBean
用于创建JobDetail
,SimpleTriggerFactoryBean
用于创建SimpleTrigger
。可以通过setStartDelay
和setRepeatInterval
方法设置任务的启动延迟和重复间隔。 - 主类:
QuartzIntegrationApplication
是 Spring Boot 的主类,启动应用后,Quartz 会按照配置的触发器规则执行任务。
更复杂的调度
若要实现更复杂的调度,可使用 CronTrigger
来定义任务的执行时间,示例如下:
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
@Configuration
public class ComplexQuartzConfig {
@Bean
public JobDetailFactoryBean complexJobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(MyJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public CronTriggerFactoryBean complexTrigger(JobDetail jobDetail) {
CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
triggerFactory.setJobDetail(jobDetail);
triggerFactory.setCronExpression("0 0 12 * * ?"); // 每天中午 12 点执行
return triggerFactory;
}
}
总结
通过以上步骤,你可以在 Spring 项目中集成 Quartz 实现任务调度。根据需求,可使用不同类型的触发器(如 SimpleTrigger
或 CronTrigger
)来实现简单或复杂的任务调度。
以下是完整的代码示例,包含任务类、配置类和主类:
MyJob.java
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalDateTime;
public class MyJob implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("任务执行时间: " + LocalDateTime.now());
}
}
ComplexQuartzConfig.java
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
@Configuration
public class ComplexQuartzConfig {
@Bean
public JobDetailFactoryBean complexJobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(MyJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public CronTriggerFactoryBean complexTrigger(JobDetail jobDetail) {
CronTriggerFactoryBean triggerFactory = new CronTriggerFactoryBean();
triggerFactory.setJobDetail(jobDetail);
triggerFactory.setCronExpression("0 0 12 * * ?"); // 每天中午 12 点执行
return triggerFactory;
}
}
QuartzConfig.java
import org.quartz.JobDetail;
import org.quartz.SimpleTrigger;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;
@Configuration
public class QuartzConfig {
@Bean
public JobDetailFactoryBean jobDetail() {
JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean();
jobDetailFactory.setJobClass(MyJob.class);
jobDetailFactory.setDurability(true);
return jobDetailFactory;
}
@Bean
public SimpleTriggerFactoryBean trigger(JobDetail jobDetail) {
SimpleTriggerFactoryBean triggerFactory = new SimpleTriggerFactoryBean();
triggerFactory.setJobDetail(jobDetail);
triggerFactory.setStartDelay(1000); // 延迟 1 秒开始执行
triggerFactory.setRepeatInterval(5000); // 每 5 秒执行一次
triggerFactory.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY);
return triggerFactory;
}
}
QuartzIntegrationApplication.java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class QuartzIntegrationApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzIntegrationApplication.class, args);
}
}