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,并用@QuartzDataSource
Comments 其@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 {
...
}
}