Quartz 调度器

Spring Boot 为使用 Quartz 调度器提供了多种便利功能,包括Spring靴启动Quartz起动机。 如果有Quartz,则调度是自动配置的(通过SchedulerFactoryBean抽象)。spring-doc.cadn.net.cn

以下类型的豆子会自动被选中并与调度:spring-doc.cadn.net.cn

默认情况下,内存JobStore被使用。然而,如果数据来源BEAN 可以在你的申请中提供,如果Spring.Quartz.Job-store-type属性的配置如下示例所示:spring-doc.cadn.net.cn

spring.quartz.job-store-type=jdbc
spring:
  quartz:
    job-store-type: "jdbc"

当使用 JDBC 存储时,模式可以在启动时初始化,如下示例所示:spring-doc.cadn.net.cn

spring.quartz.jdbc.initialize-schema=always
spring:
  quartz:
    jdbc:
      initialize-schema: "always"
默认情况下,数据库通过 Quartz 库提供的标准脚本进行检测和初始化。这些脚本会丢弃现有表,每次重启时都会删除所有触发器。要使用自定义脚本,请设置Spring.Quartz.jdbc.schema财产。 一些标准脚本——如 SQL Server、Azure SQL 和 Sybase 脚本——无法在不修改的情况下使用。在这种情况下,复制脚本并按照脚本注释中的指示编辑,然后设置Spring.Quartz.jdbc.schema使用你定制的脚本。

让Quartz使用一个数据来源除了应用程序的主体数据来源,宣告a数据来源豆子,注释其@Bean方法:@QuartzDataSource. 这样做可以确保Quartz特有的数据来源被两种SchedulerFactoryBean用于模式初始化。类似地,让Quartz使用一个事务管理器除了应用程序的主体事务管理器声明a事务管理器豆子,注释其@Bean方法:@QuartzTransactionManager.spring-doc.cadn.net.cn

默认情况下,配置创建的作业不会覆盖已注册且已从持久作业存储读取的作业。要启用覆盖现有作业定义,请设置Spring.Quartz.Overwrite-existing-jobs财产。spring-doc.cadn.net.cn

Quartz 调度器配置可通过以下方式进行自定义Spring.Quartz性质和SchedulerFactoryBeanCustomizerBEANS,允许程序化SchedulerFactoryBean定制。 高级Quartz配置属性可以通过以下方式进行定制spring.quartz.properties.*.spring-doc.cadn.net.cn

特别地,一个执行者BEAN 与调度器不关联,因为 Quartz 提供了通过以下方式配置调度器的方法Spring.Quartz.Properties. 如果你需要自定义任务执行器,可以考虑实现SchedulerFactoryBeanCustomizer.

作业可以定义设置器来注入数据映射属性。普通豆子也可以以类似方式注入,如下示例所示:spring-doc.cadn.net.cn

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

}