Spring Boot offers several conveniences for working with the
Quartz scheduler, including the
spring-boot-starter-quartz
“Starter”. If Quartz is available, a Scheduler
is
auto-configured (through the SchedulerFactoryBean
abstraction).
Beans of the following types are automatically picked up and associated with the
Scheduler
:
JobDetail
: defines a particular Job. JobDetail
instances can be built with the
JobBuilder
API.Calendar
.Trigger
: defines when a particular job is triggered.By default, an in-memory JobStore
is used. However, it is possible to configure a
JDBC-based store if a DataSource
bean is available in your application and if the
spring.quartz.job-store-type
property is configured accordingly, as shown in the
following example:
spring.quartz.job-store-type=jdbc
When the JDBC store is used, the schema can be initialized on startup, as shown in the following example:
spring.quartz.jdbc.initialize-schema=always
Warning | |
---|---|
By default, the database is detected and initialized by using the standard scripts
provided with the Quartz library. These scripts drop existing tables, deleting all triggers
on every restart. It is also possible to provide a custom script by setting the
|
To have Quartz use a DataSource
other than the application’s main DataSource
, declare
a DataSource
bean, annotating its @Bean
method with @QuartzDataSource
. Doing so
ensures that the Quartz-specific DataSource
is used by both the SchedulerFactoryBean
and for schema initialization.
Quartz Scheduler configuration can be customized by using Quartz configuration properties
()spring.quartz.properties.*
) and SchedulerFactoryBeanCustomizer
beans, which allow
programmatic SchedulerFactoryBean
customization.
Note | |
---|---|
In particular, an |
Jobs can define setters to inject data map properties. Regular beans can also be injected in a similar manner, as shown in the following example:
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 { ... } }