| 此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Boot 3.5.5! | 
Quartz 调度程序
Spring Boot 为使用 Quartz 调度器提供了多种便利,包括spring-boot-starter-quartz起动机。
如果 Quartz 可用,则Scheduler自动配置(通过SchedulerFactoryBean抽象)。
以下类型的 bean 会自动选取并与Scheduler:
- 
JobDetail:定义特定的作业。JobDetail实例可以使用JobBuilder应用程序接口。
- 
Trigger:定义何时触发特定作业。
默认情况下,内存中的JobStore被使用。
但是,如果DataSourcebean 在您的应用程序中可用,并且如果spring.quartz.job-store-type属性进行相应配置,如以下示例所示:
- 
Properties 
- 
YAML 
spring.quartz.job-store-type=jdbcspring:
  quartz:
    job-store-type: "jdbc"使用 JDBC 存储时,可以在启动时初始化模式,如以下示例所示:
- 
Properties 
- 
YAML 
spring.quartz.jdbc.initialize-schema=alwaysspring:
  quartz:
    jdbc:
      initialize-schema: "always"| 默认情况下,使用 Quartz 库提供的标准脚本来检测和初始化数据库。
这些脚本会删除现有表,并在每次重新启动时删除所有触发器。
要使用自定义脚本,请将 spring.quartz.jdbc.schema财产。
某些标准脚本(例如用于 SQL Server、Azure SQL 和 Sybase 的脚本)无法在不进行修改的情况下使用。
在这些情况下,请复制脚本并按照脚本注释中的指示进行编辑,然后将spring.quartz.jdbc.schema以使用自定义脚本。 | 
要让 Quartz 使用DataSource除了应用程序的主要内容DataSource,声明一个DataSourcebean,注释其@Bean方法@QuartzDataSource.
这样做可以确保特定于 Quartz 的DataSource由SchedulerFactoryBean以及用于模式初始化。
同样,要让 Quartz 使用TransactionManager除了应用程序的主要内容TransactionManager声明一个TransactionManagerbean,注释其@Bean方法@QuartzTransactionManager.
缺省情况下,配置创建的作业不会覆盖已从持久性作业存储中读取的已注册作业。
要启用覆盖现有作业定义,请将spring.quartz.overwrite-existing-jobs财产。
Quartz 调度器配置可以使用以下命令进行自定义spring.quartzproperties 和SchedulerFactoryBeanCustomizerbean,允许编程SchedulerFactoryBean定制。
高级 Quartz 配置属性可以使用以下命令进行自定义spring.quartz.properties.*.
| 特别是,一个 Executorbean 与调度器无关,因为 Quartz 提供了一种通过spring.quartz.properties.
如果您需要自定义任务执行器,请考虑实现SchedulerFactoryBeanCustomizer. | 
作业可以定义 setter 来注入数据映射属性。 常规 bean 也可以以类似的方式注入,如以下示例所示:
- 
Java 
- 
Kotlin 
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);
	}
}import org.quartz.JobExecutionContext
import org.springframework.scheduling.quartz.QuartzJobBean
class MySampleJob : QuartzJobBean() {
	// fields ...
	private var myService: MyService? = null
	private var name: String? = null
	// Inject "MyService" bean
	fun setMyService(myService: MyService?) {
		this.myService = myService
	}
	// Inject the "name" job data property
	fun setName(name: String?) {
		this.name = name
	}
	override fun executeInternal(context: JobExecutionContext) {
		myService!!.someMethod(context.fireTime, name)
	}
}