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,并且 configprop:spring.quartz.job-store-type[] 属性已相应配置,则可以配置基于 JDBC 的存储,如下面的示例所示:

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

当使用 JDBC 存储时,可以在启动时初始化架构,如下面的示例所示:

spring:
  quartz:
    jdbc:
      initialize-schema: "always"

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

要让 Quartz 使用除应用程序的主 DataSource 外的其他 DataSource,请声明一个 DataSource Bean,使用 @QuartzDataSource 注释其 @Bean 方法。这样做可确保 SchedulerFactoryBean 和架构初始化均使用 Quartz 专用的 DataSource。类似地,要让 Quartz 使用除应用程序的主 TransactionManager 外的其他 TransactionManager,请声明一个 TransactionManager Bean,使用 @QuartzTransactionManager 注释其 @Bean 方法。

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

可以使用 spring.quartz 属性和 SchedulerFactoryBeanCustomizer Bean 自定义 Quartz Scheduler 配置,它们支持以编程方式 SchedulerFactoryBean 自定义。可以使用 spring.quartz.properties.* 自定义高级 Quartz 配置属性。

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

作业可以定义 setter 来注入数据映射属性。普通 bean 也可以以类似的方式注入,如下面的示例所示: