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
Note | |
---|---|
By default, the database is detected and initialized by using the standard scripts
provided with the Quartz library. 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.
By default, jobs created by configuration will not overwrite already registered jobs that
have been read from a persistent job store. To enable overwriting existing job definitions
set the spring.quartz.overwrite-existing-jobs
property.
Quartz Scheduler configuration can be customized using spring.quartz
properties and
SchedulerFactoryBeanCustomizer
beans, which allow programmatic SchedulerFactoryBean
customization. Advanced Quartz configuration properties can be customized using
spring.quartz.properties.*
.
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 { ... } }