在 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 注解,定义了 JobDetailTriggerJobDetailFactoryBean 用于创建 JobDetailSimpleTriggerFactoryBean 用于创建 SimpleTrigger。可以通过 setStartDelaysetRepeatInterval 方法设置任务的启动延迟和重复间隔。
  • 主类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 实现任务调度。根据需求,可使用不同类型的触发器(如 SimpleTriggerCronTrigger)来实现简单或复杂的任务调度。

以下是完整的代码示例,包含任务类、配置类和主类:

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);
    }
}