Quartz Scheduler

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

自动拾取以下类型的豆并与以下相关联 Scheduler

  • JobDetail:定义一个特定的Job。JobDetail可以使用JobBuilderAPI 构建实例 。
  • Calendar
  • Trigger:定义何时触发特定作业。

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

1
spring.quartz.job-store-type=jdbc

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

1
spring.quartz.jdbc.initialize-schema=always

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

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

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

可以使用spring.quartz属性和 SchedulerFactoryBeanCustomizerbean 自定义Quartz Scheduler配置,这允许进行编程SchedulerFactoryBean 自定义。可以使用高级Quartz配置属性进行自定义 spring.quartz.properties.*

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 {
...
}
}

任务执行和调度

Executor上下文中没有bean的情况下,Spring Boot会自动配置一个 ThreadPoolTaskExecutor合理的默认值,这些默认值可以自动关联到异步任务执行(@EnableAsync)和Spring MVC异步请求处理。

如果您Executor在上下文中定义了自定义,则常规任务执行(即 @EnableAsync)将透明地使用它,但不会配置Spring MVC支持,因为它需要AsyncTaskExecutor实现(命名 applicationTaskExecutor)。根据您的目标安排,您可以将您更改 Executor为a ThreadPoolTaskExecutor或定义a ThreadPoolTaskExecutorAsyncConfigurer包装自定义Executor

自动配置TaskExecutorBuilder允许您轻松创建实例,以重现默认情况下自动配置的功能。

线程池使用8个核心线程,可根据负载增长和缩小。可以使用spring.task.execution命名空间对这些默认设置进行微调,如以下示例所示:

1
2
3
spring.task.execution.pool.max-threads=16
spring.task.execution.pool.queue-capacity=100
spring.task.execution.pool.keep-alive=10s

这会将线程池更改为使用有界队列,以便在队列满(100个任务)时,线程池增加到最多16个线程。当线程在闲置10秒(而不是默认为60秒)时回收线程时,池的收缩会更加激进。

ThreadPoolTaskScheduler如果需要与计划任务执行(@EnableScheduling)相关联,也可以自动配置A. 默认情况下,线程池使用一个线程,并且可以使用spring.task.scheduling命名空间对这些设置进行微调。

既是TaskExecutorBuilder豆和TaskSchedulerBuilder绿豆可在上下文提供如果自定义遗嘱执行人或调度需要创建。