4.19 Quartz Scheduler
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 {
...
}
}