40. Quartz Scheduler

Spring Boot 为使用Quartz scheduler提供了许多便利,其中包括spring-boot-starter-quartz“ Starter”。如果 Quartz 可用,则会自动配置Scheduler(通过SchedulerFactoryBean抽象)。

以下类型的 Bean 被自动拾取并与Scheduler关联:

  • JobDetail:定义特定的作业。可以使用JobBuilder API 构建JobDetail实例。

  • Calendar .

  • Trigger:定义何时触发特定作业。

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

spring.quartz.job-store-type=jdbc

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

spring.quartz.jdbc.initialize-schema=always

Warning

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

要让 Quartz 使用除应用程序主DataSource之外的DataSource,请声明DataSource bean,并用@QuartzDataSourceComments 其@Bean方法。这样做可确保SchedulerFactoryBean使用 Quartz 专用的DataSource并用于模式初始化。

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

可以使用spring.quartz属性和SchedulerFactoryBeanCustomizer bean 自定义 Quartz Scheduler 配置,从而可以通过编程方式自定义SchedulerFactoryBean。可以使用spring.quartz.properties.*定制高级 Quartz 配置属性。

Note

特别是,Executor bean 没有与调度程序相关联,因为 Quartz 提供了一种通过spring.quartz.properties配置调度程序的方法。如果您需要自定义任务 Actuator,请考虑实现SchedulerFactoryBeanCustomizer

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

public class SampleJob extends QuartzJobBean {

	private MyService myService;

	private String name;

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

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

	@Override
	protected void executeInternal(JobExecutionContext context)
			throws JobExecutionException {
		...
	}

}