4.19 Quartz Scheduler

优质
小牛编辑
131浏览
2023-12-01

Spring Boot提供了几种使用Quartz调度程序的便利,包括spring-boot-starter-quartz的“Starter”。 如果Quartz可用,则自动配置Scheduler(通过SchedulerFactoryBean抽象)。

自动选取以下类型的Bean并将其与Scheduler程序关联:

  • JobDetail:定义一个特定的Job。 可以使用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

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

要让Quartz使用除应用程序主DataSource之外的DataSource,请声明一个DataSource bean,使用@QuartzDataSource注释其@Bean方法。 这样做可确保SchedulerFactoryBean和架构初始化都使用特定于Quartz的DataSource。

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

Quartz Scheduler配置可以使用spring.quartz属性和SchedulerFactoryBeanCustomizer bean进行自定义,它们允许程序化的SchedulerFactoryBean自定义。 可以使用spring.quartz.properties.*定制高级Quartz配置属性。

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

Job可以定义setter以注入数据映射属性。 也可以以类似的方式注入常规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 {
		...
	}

}