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=jdbcWhen 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.
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 { ... } }