diff --git a/spring-boot-autoconfigure/pom.xml b/spring-boot-autoconfigure/pom.xml
index 2126c5c248e2..1b7893a057ed 100755
--- a/spring-boot-autoconfigure/pom.xml
+++ b/spring-boot-autoconfigure/pom.xml
@@ -656,6 +656,11 @@
narayana-jts-integration
true
+
+ org.quartz-scheduler
+ quartz
+ true
+
org.springframework.boot
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/AutowireCapableBeanJobFactory.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/AutowireCapableBeanJobFactory.java
new file mode 100644
index 000000000000..36828976da0a
--- /dev/null
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/AutowireCapableBeanJobFactory.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2012-2017 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.quartz;
+
+import org.quartz.spi.TriggerFiredBundle;
+
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.scheduling.quartz.SpringBeanJobFactory;
+import org.springframework.util.Assert;
+
+/**
+ * Subclass of {@link SpringBeanJobFactory} that supports auto-wiring job beans.
+ *
+ * @author Vedran Pavic
+ * @since 2.0.0
+ * @see Inject application
+ * context dependencies in Quartz job beans
+ */
+class AutowireCapableBeanJobFactory extends SpringBeanJobFactory {
+
+ private final AutowireCapableBeanFactory beanFactory;
+
+ AutowireCapableBeanJobFactory(AutowireCapableBeanFactory beanFactory) {
+ Assert.notNull(beanFactory, "Bean factory must not be null");
+ this.beanFactory = beanFactory;
+ }
+
+ @Override
+ protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
+ Object jobInstance = super.createJobInstance(bundle);
+ this.beanFactory.autowireBean(jobInstance);
+ this.beanFactory.initializeBean(jobInstance, null);
+ return jobInstance;
+ }
+
+}
diff --git a/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java
new file mode 100644
index 000000000000..1748a4e3d805
--- /dev/null
+++ b/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfiguration.java
@@ -0,0 +1,161 @@
+/*
+ * Copyright 2012-2017 the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.springframework.boot.autoconfigure.quartz;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.Executor;
+
+import javax.sql.DataSource;
+
+import org.quartz.Calendar;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.Trigger;
+
+import org.springframework.beans.BeansException;
+import org.springframework.beans.factory.ObjectProvider;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.AnnotationAwareOrderComparator;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.springframework.transaction.PlatformTransactionManager;
+
+/**
+ * {@link EnableAutoConfiguration Auto-configuration} for Quartz Scheduler.
+ *
+ * @author Vedran Pavic
+ * @since 2.0.0
+ */
+@Configuration
+@ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class,
+ PlatformTransactionManager.class })
+@EnableConfigurationProperties(QuartzProperties.class)
+@AutoConfigureAfter({ DataSourceAutoConfiguration.class,
+ HibernateJpaAutoConfiguration.class })
+public class QuartzAutoConfiguration implements ApplicationContextAware {
+
+ private final QuartzProperties properties;
+
+ private final List customizers;
+
+ private final Executor taskExecutor;
+
+ private final JobDetail[] jobDetails;
+
+ private final Map calendars;
+
+ private final Trigger[] triggers;
+
+ private ApplicationContext applicationContext;
+
+ public QuartzAutoConfiguration(QuartzProperties properties,
+ ObjectProvider> customizers,
+ ObjectProvider taskExecutor, ObjectProvider jobDetails,
+ ObjectProvider
+
+ org.springframework.boot
+ spring-boot-starter-quartz
+ 2.0.0.BUILD-SNAPSHOT
+
org.springframework.boot
spring-boot-starter-security
@@ -1970,6 +1976,11 @@
lombok
${lombok.version}
+
+ org.quartz-scheduler
+ quartz
+ ${quartz.version}
+
org.seleniumhq.selenium
htmlunit-driver
diff --git a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc
index d8b95cc15dfa..2f9e1e4b18f3 100644
--- a/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc
+++ b/spring-boot-docs/src/main/asciidoc/appendix-application-properties.adoc
@@ -129,6 +129,11 @@ content into your application; rather pick only the properties that you need.
spring.profiles.active= # Comma-separated list (or list if using YAML) of <>.
spring.profiles.include= # Unconditionally activate the specified comma separated profiles (or list of profiles if using YAML).
+ # QUARTZ SCHEDULER ({sc-spring-boot-autoconfigure}/quartz/QuartzProperties.{sc-ext}[QuartzProperties])
+ spring.quartz.initializer.enabled=true # Create the required Quartz Scheduler tables on startup if necessary. Enabled automatically if the schema is configured.
+ spring.quartz.properties.*= # Additional Quartz Scheduler properties.
+ spring.quartz.schema=classpath:org/quartz/impl/jdbcjobstore/tables_@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
+
# Reactor
spring.reactor.stacktrace-mode.enabled=false # Set whether Reactor should collect stacktrace information at runtime.
diff --git a/spring-boot-docs/src/main/asciidoc/index.adoc b/spring-boot-docs/src/main/asciidoc/index.adoc
index 21a401598bdb..2672eda02962 100644
--- a/spring-boot-docs/src/main/asciidoc/index.adoc
+++ b/spring-boot-docs/src/main/asciidoc/index.adoc
@@ -1,5 +1,5 @@
= Spring Boot Reference Guide
-Phillip Webb; Dave Syer; Josh Long; Stéphane Nicoll; Rob Winch; Andy Wilkinson; Marcel Overdijk; Christian Dupuis; Sébastien Deleuze; Michael Simons
+Phillip Webb; Dave Syer; Josh Long; Stéphane Nicoll; Rob Winch; Andy Wilkinson; Marcel Overdijk; Christian Dupuis; Sébastien Deleuze; Michael Simons; Vedran Pavić
:doctype: book
:toc:
:toclevels: 4
diff --git a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
index 76974087b4e3..aa1a3daf66f0 100644
--- a/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
+++ b/spring-boot-docs/src/main/asciidoc/spring-boot-features.adoc
@@ -5151,6 +5151,37 @@ caching is enabled.
+[[boot-features-quartz]]
+== Quartz Scheduler
+
+If Quartz Scheduler and the relevant libraries (as defined by `spring-boot-starter-quartz`)
+are on the classpath, Spring Boot will auto-configure a `SchedulerFactoryBean` which
+provides `Scheduler` instance that you can inject in your application.
+
+Beans of following types will be automatically picked up and added to
+`SchedulerFactoryBean`:
+
+* `JobDetail`
+* `Calendar`
+* `Trigger`
+
+By default, an in-memory `JobStore` will be used. However, if `DataSource` bean is
+available in your application, Quartz Scheduler will be configured with a persistent
+`JobStore`.
+
+When using a persistent `JobStore`, Quartz database schema can be initialized using
+`QuartzDatabaseInitializer` if the location of schema script is configured using
+`spring.quartz.schema` property.
+
+Quartz Scheduler configuration can also be customized using Quartz configuration properties
+(see `spring.quartz.properties.*`) and `SchedulerFactoryBeanCustomizer` beans which
+allows programmatic `SchedulerFactoryBean` customization.
+
+Spring Boot also configures `JobFactory` that is `@Autowire` capable so you can easily
+inject beans from `applicationContext` and use them in your Quartz jobs.
+
+
+
[[boot-features-integration]]
== Spring Integration
Spring Boot offers several conveniences for working with Spring Integration, including
diff --git a/spring-boot-samples/pom.xml b/spring-boot-samples/pom.xml
index 7a263b099410..8fa1bc4280ea 100644
--- a/spring-boot-samples/pom.xml
+++ b/spring-boot-samples/pom.xml
@@ -71,6 +71,7 @@
spring-boot-sample-parent-context
spring-boot-sample-profile
spring-boot-sample-property-validation
+ spring-boot-sample-quartz
spring-boot-sample-secure
spring-boot-sample-secure-oauth2
spring-boot-sample-secure-oauth2-actuator
diff --git a/spring-boot-samples/spring-boot-sample-quartz/README.adoc b/spring-boot-samples/spring-boot-sample-quartz/README.adoc
new file mode 100644
index 000000000000..87e93024c823
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-quartz/README.adoc
@@ -0,0 +1,11 @@
+== Spring Boot Quartz Sample
+
+This sample demonstrates the Quartz auto-configuration support.
+
+The sample uses Maven. It can be built and run from the command line:
+
+----
+$ mvn spring-boot:run
+----
+
+Console log will now show Hello message from SampleJob every 10 seconds.
diff --git a/spring-boot-samples/spring-boot-sample-quartz/pom.xml b/spring-boot-samples/spring-boot-sample-quartz/pom.xml
new file mode 100644
index 000000000000..a161afa0be62
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-quartz/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+
+ org.springframework.boot
+ spring-boot-samples
+ 2.0.0.BUILD-SNAPSHOT
+
+ spring-boot-sample-quartz
+ Spring Boot Quartz Sample
+ Spring Boot Quartz Sample
+ http://projects.spring.io/spring-boot/
+
+ Pivotal Software, Inc.
+ http://www.spring.io
+
+
+ ${basedir}/../..
+
+
+
+ org.springframework.boot
+ spring-boot-starter-quartz
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
diff --git a/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleJob.java b/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleJob.java
new file mode 100644
index 000000000000..f5d82888836e
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleJob.java
@@ -0,0 +1,20 @@
+package sample.quartz;
+
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.scheduling.quartz.QuartzJobBean;
+
+public class SampleJob extends QuartzJobBean {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(SampleJob.class);
+
+ @Override
+ protected void executeInternal(JobExecutionContext context)
+ throws JobExecutionException {
+ LOGGER.info("Hello {}!", context.getJobDetail().getKey());
+ }
+
+}
diff --git a/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleQuartzApplication.java b/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleQuartzApplication.java
new file mode 100644
index 000000000000..6c1530071fe0
--- /dev/null
+++ b/spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleQuartzApplication.java
@@ -0,0 +1,35 @@
+package sample.quartz;
+
+import org.quartz.JobBuilder;
+import org.quartz.JobDetail;
+import org.quartz.SimpleScheduleBuilder;
+import org.quartz.Trigger;
+import org.quartz.TriggerBuilder;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.Bean;
+
+@SpringBootApplication
+public class SampleQuartzApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SampleQuartzApplication.class, args);
+ }
+
+ @Bean
+ public JobDetail jobDetail() {
+ return JobBuilder.newJob().ofType(SampleJob.class).withIdentity("sampleJob")
+ .storeDurably().build();
+ }
+
+ @Bean
+ public Trigger trigger() {
+ SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
+ .withIntervalInSeconds(10).repeatForever();
+
+ return TriggerBuilder.newTrigger().forJob(jobDetail())
+ .withIdentity("sampleTrigger").withSchedule(scheduleBuilder).build();
+ }
+
+}
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index eaff2e49abfd..ddf430ce2528 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -59,6 +59,7 @@
spring-boot-starter-mustache
spring-boot-starter-actuator
spring-boot-starter-parent
+ spring-boot-starter-quartz
spring-boot-starter-reactor-netty
spring-boot-starter-security
spring-boot-starter-social-facebook
diff --git a/spring-boot-starters/spring-boot-starter-quartz/pom.xml b/spring-boot-starters/spring-boot-starter-quartz/pom.xml
new file mode 100644
index 000000000000..a2f0c7489f57
--- /dev/null
+++ b/spring-boot-starters/spring-boot-starter-quartz/pom.xml
@@ -0,0 +1,38 @@
+
+
+ 4.0.0
+
+ org.springframework.boot
+ spring-boot-starters
+ 2.0.0.BUILD-SNAPSHOT
+
+ spring-boot-starter-quartz
+ Spring Boot Quartz Starter
+ Spring Boot Quartz Starter
+ http://projects.spring.io/spring-boot/
+
+ Pivotal Software, Inc.
+ http://www.spring.io
+
+
+ ${basedir}/../..
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework
+ spring-context-support
+
+
+ org.springframework
+ spring-tx
+
+
+ org.quartz-scheduler
+ quartz
+
+
+
diff --git a/spring-boot-starters/spring-boot-starter-quartz/src/main/resources/META-INF/spring.provides b/spring-boot-starters/spring-boot-starter-quartz/src/main/resources/META-INF/spring.provides
new file mode 100644
index 000000000000..55020b99f9d8
--- /dev/null
+++ b/spring-boot-starters/spring-boot-starter-quartz/src/main/resources/META-INF/spring.provides
@@ -0,0 +1 @@
+provides: spring-context-support,spring-tx,quartz