跳到主要内容

Quartz 调度器

DeepSeek V3 中英对照 Quartz Scheduler

Spring Boot 为使用 Quartz 调度器提供了多种便利,包括 spring-boot-starter-quartz starter。如果 Quartz 可用,则会自动配置一个 Scheduler(通过 SchedulerFactoryBean 抽象)。

以下类型的 Bean 会自动被识别并与 Scheduler 关联:

默认情况下,使用内存中的 JobStore。然而,如果您的应用程序中存在 DataSource bean 并且 spring.quartz.job-store-type 属性已进行相应配置,则可以配置基于 JDBC 的存储,如下例所示:

spring.quartz.job-store-type=jdbc
properties

当使用 JDBC 存储时,可以在启动时初始化模式,如下例所示:

spring.quartz.jdbc.initialize-schema=always
properties
注意

默认情况下,数据库是通过使用 Quartz 库提供的标准脚本进行检测和初始化的。这些脚本会在每次重启时删除现有表,并清除所有触发器。您也可以通过设置 spring.quartz.jdbc.schema 属性来提供自定义脚本。

要让 Quartz 使用与应用程序主 DataSource 不同的 DataSource,可以声明一个 DataSource bean,并在其 @Bean 方法上使用 @QuartzDataSource 注解。这样做可以确保 Quartz 特定的 DataSourceSchedulerFactoryBean 和模式初始化使用。同样地,要让 Quartz 使用与应用程序主 TransactionManager 不同的 TransactionManager,可以声明一个 TransactionManager bean,并在其 @Bean 方法上使用 @QuartzTransactionManager 注解。

默认情况下,通过配置创建的作业不会覆盖已从持久化作业存储中读取的已注册作业。要启用覆盖现有作业定义的功能,请设置 spring.quartz.overwrite-existing-jobs 属性。

Quartz Scheduler 的配置可以通过 spring.quartz 属性和 SchedulerFactoryBeanCustomizer Bean 进行自定义,这些 Bean 允许以编程方式对 SchedulerFactoryBean 进行定制。高级 Quartz 配置属性可以通过 spring.quartz.properties.* 进行自定义。

备注

特别地,Executor Bean 并不会与调度器关联,因为 Quartz 提供了一种通过 spring.quartz.properties 来配置调度器的方式。如果你需要自定义任务执行器,可以考虑实现 SchedulerFactoryBeanCustomizer

作业可以定义设置器来注入数据映射属性。常规的 Bean 也可以以类似的方式注入,如下例所示:

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

import org.springframework.scheduling.quartz.QuartzJobBean;

public class MySampleJob extends QuartzJobBean {

// fields ...

private MyService myService;

private String name;

// Inject "MyService" bean
public void setMyService(MyService myService) {
this.myService = myService;
}

// Inject the "name" job data property
public void setName(String name) {
this.name = name;
}

@Override
protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
this.myService.someMethod(context.getFireTime(), this.name);
}

}
java