Skip to content

Commit a52d553

Browse files
committed
Make Quartz DataSource init back off without spring-boot-jdbc
Previously, setting spring.quartz.job-store-type to jdbc assumed that spring-boot-jdbc was on the classpath. If it was not, the context would fail to refresh as DataSourceScriptDatabaseInitializer was not available. This commit updates the auto-configuration so that the DataSource initialization will back off when spring-boot-jdbc is absent. This allows an app to use Quartz without spring-boot-jdbc and spring-boot-sql. This remains true even when using the JDBC job store as long as something else has created the DataSource and initialized its schema to contain the tables that Quartz requires. Closes gh-46243
1 parent 5db3cac commit a52d553

File tree

7 files changed

+192
-118
lines changed

7 files changed

+192
-118
lines changed

spring-boot-project/spring-boot-quartz/build.gradle

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ dependencies {
3030
api("org.quartz-scheduler:quartz")
3131
api("org.springframework:spring-context-support")
3232

33-
implementation(project(":spring-boot-project:spring-boot-sql"))
34-
3533
optional(project(":spring-boot-project:spring-boot-actuator-autoconfigure"))
3634
optional(project(":spring-boot-project:spring-boot-autoconfigure"))
3735
optional(project(":spring-boot-project:spring-boot-jdbc"))

spring-boot-project/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzAutoConfiguration.java

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3535
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
3636
import org.springframework.boot.context.properties.EnableConfigurationProperties;
37+
import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
3738
import org.springframework.boot.sql.autoconfigure.init.OnDatabaseInitializationCondition;
3839
import org.springframework.boot.sql.init.dependency.DatabaseInitializationDependencyConfigurer;
3940
import org.springframework.context.ApplicationContext;
@@ -114,7 +115,7 @@ public SchedulerFactoryBeanCustomizer dataSourceCustomizer(QuartzProperties prop
114115
};
115116
}
116117

117-
private DataSource getDataSource(DataSource dataSource, ObjectProvider<DataSource> quartzDataSource) {
118+
private static DataSource getDataSource(DataSource dataSource, ObjectProvider<DataSource> quartzDataSource) {
118119
DataSource dataSourceIfAvailable = quartzDataSource.getIfAvailable();
119120
return (dataSourceIfAvailable != null) ? dataSourceIfAvailable : dataSource;
120121
}
@@ -127,20 +128,26 @@ private PlatformTransactionManager getTransactionManager(
127128
: transactionManager.getIfUnique();
128129
}
129130

130-
@Bean
131-
@ConditionalOnMissingBean
132-
@Conditional(OnQuartzDatasourceInitializationCondition.class)
133-
public QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseInitializer(
134-
DataSource dataSource, @QuartzDataSource ObjectProvider<DataSource> quartzDataSource,
135-
QuartzProperties properties) {
136-
DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource);
137-
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties);
138-
}
131+
@Configuration(proxyBeanMethods = false)
132+
@EnableConfigurationProperties(QuartzJdbcProperties.class)
133+
@ConditionalOnClass(DataSourceScriptDatabaseInitializer.class)
134+
static class QuartzDataSourceInitializationConfiguration {
139135

140-
static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
136+
@Bean
137+
@ConditionalOnMissingBean
138+
@Conditional(OnQuartzDatasourceInitializationCondition.class)
139+
QuartzDataSourceScriptDatabaseInitializer quartzDataSourceScriptDatabaseInitializer(DataSource dataSource,
140+
@QuartzDataSource ObjectProvider<DataSource> quartzDataSource, QuartzJdbcProperties properties) {
141+
DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource);
142+
return new QuartzDataSourceScriptDatabaseInitializer(dataSourceToUse, properties);
143+
}
144+
145+
static class OnQuartzDatasourceInitializationCondition extends OnDatabaseInitializationCondition {
146+
147+
OnQuartzDatasourceInitializationCondition() {
148+
super("Quartz", "spring.quartz.jdbc.initialize-schema");
149+
}
141150

142-
OnQuartzDatasourceInitializationCondition() {
143-
super("Quartz", "spring.quartz.jdbc.initialize-schema");
144151
}
145152

146153
}

spring-boot-project/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzDataSourceScriptDatabaseInitializer.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ public class QuartzDataSourceScriptDatabaseInitializer extends DataSourceScriptD
4747
* @param properties the Quartz properties
4848
* @see #getSettings
4949
*/
50-
public QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, QuartzProperties properties) {
51-
this(dataSource, getSettings(dataSource, properties), properties.getJdbc().getCommentPrefix());
50+
public QuartzDataSourceScriptDatabaseInitializer(DataSource dataSource, QuartzJdbcProperties properties) {
51+
this(dataSource, getSettings(dataSource, properties), properties.getCommentPrefix());
5252
}
5353

5454
/**
@@ -84,15 +84,15 @@ protected void customize(ResourceDatabasePopulator populator) {
8484
* @see #QuartzDataSourceScriptDatabaseInitializer(DataSource,
8585
* DatabaseInitializationSettings)
8686
*/
87-
public static DatabaseInitializationSettings getSettings(DataSource dataSource, QuartzProperties properties) {
87+
public static DatabaseInitializationSettings getSettings(DataSource dataSource, QuartzJdbcProperties properties) {
8888
DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
89-
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties.getJdbc()));
90-
settings.setMode(properties.getJdbc().getInitializeSchema());
89+
settings.setSchemaLocations(resolveSchemaLocations(dataSource, properties));
90+
settings.setMode(properties.getInitializeSchema());
9191
settings.setContinueOnError(true);
9292
return settings;
9393
}
9494

95-
private static List<String> resolveSchemaLocations(DataSource dataSource, QuartzProperties.Jdbc properties) {
95+
private static List<String> resolveSchemaLocations(DataSource dataSource, QuartzJdbcProperties properties) {
9696
PlatformPlaceholderDatabaseDriverResolver platformResolver = new PlatformPlaceholderDatabaseDriverResolver();
9797
platformResolver = platformResolver.withDriverPlatform(DatabaseDriver.DB2, "db2_v95");
9898
platformResolver = platformResolver.withDriverPlatform(DatabaseDriver.MYSQL, "mysql_innodb");
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
/*
2+
* Copyright 2012-present the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.quartz.autoconfigure;
18+
19+
import java.util.ArrayList;
20+
import java.util.Arrays;
21+
import java.util.List;
22+
23+
import org.springframework.boot.context.properties.ConfigurationProperties;
24+
import org.springframework.boot.sql.init.DatabaseInitializationMode;
25+
26+
/**
27+
* Configuration properties for the Quartz Scheduler integration when using a JDBC job
28+
* store.
29+
*
30+
* @author Vedran Pavic
31+
* @author Stephane Nicoll
32+
* @since 4.0.0
33+
*/
34+
@ConfigurationProperties("spring.quartz.jdbc")
35+
public class QuartzJdbcProperties {
36+
37+
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/quartz/impl/"
38+
+ "jdbcjobstore/tables_@@platform@@.sql";
39+
40+
/**
41+
* Path to the SQL file to use to initialize the database schema.
42+
*/
43+
private String schema = DEFAULT_SCHEMA_LOCATION;
44+
45+
/**
46+
* Platform to use in initialization scripts if the @@platform@@ placeholder is used.
47+
* Auto-detected by default.
48+
*/
49+
private String platform;
50+
51+
/**
52+
* Database schema initialization mode.
53+
*/
54+
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
55+
56+
/**
57+
* Prefixes for single-line comments in SQL initialization scripts.
58+
*/
59+
private List<String> commentPrefix = new ArrayList<>(Arrays.asList("#", "--"));
60+
61+
public String getSchema() {
62+
return this.schema;
63+
}
64+
65+
public void setSchema(String schema) {
66+
this.schema = schema;
67+
}
68+
69+
public String getPlatform() {
70+
return this.platform;
71+
}
72+
73+
public void setPlatform(String platform) {
74+
this.platform = platform;
75+
}
76+
77+
public DatabaseInitializationMode getInitializeSchema() {
78+
return this.initializeSchema;
79+
}
80+
81+
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
82+
this.initializeSchema = initializeSchema;
83+
}
84+
85+
public List<String> getCommentPrefix() {
86+
return this.commentPrefix;
87+
}
88+
89+
public void setCommentPrefix(List<String> commentPrefix) {
90+
this.commentPrefix = commentPrefix;
91+
}
92+
93+
}

spring-boot-project/spring-boot-quartz/src/main/java/org/springframework/boot/quartz/autoconfigure/QuartzProperties.java

Lines changed: 0 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,10 @@
1717
package org.springframework.boot.quartz.autoconfigure;
1818

1919
import java.time.Duration;
20-
import java.util.ArrayList;
21-
import java.util.Arrays;
2220
import java.util.HashMap;
23-
import java.util.List;
2421
import java.util.Map;
2522

2623
import org.springframework.boot.context.properties.ConfigurationProperties;
27-
import org.springframework.boot.sql.init.DatabaseInitializationMode;
2824

2925
/**
3026
* Configuration properties for the Quartz Scheduler integration.
@@ -73,8 +69,6 @@ public class QuartzProperties {
7369
*/
7470
private final Map<String, String> properties = new HashMap<>();
7571

76-
private final Jdbc jdbc = new Jdbc();
77-
7872
public JobStoreType getJobStoreType() {
7973
return this.jobStoreType;
8074
}
@@ -127,68 +121,4 @@ public Map<String, String> getProperties() {
127121
return this.properties;
128122
}
129123

130-
public Jdbc getJdbc() {
131-
return this.jdbc;
132-
}
133-
134-
public static class Jdbc {
135-
136-
private static final String DEFAULT_SCHEMA_LOCATION = "classpath:org/quartz/impl/"
137-
+ "jdbcjobstore/tables_@@platform@@.sql";
138-
139-
/**
140-
* Path to the SQL file to use to initialize the database schema.
141-
*/
142-
private String schema = DEFAULT_SCHEMA_LOCATION;
143-
144-
/**
145-
* Platform to use in initialization scripts if the @@platform@@ placeholder is
146-
* used. Auto-detected by default.
147-
*/
148-
private String platform;
149-
150-
/**
151-
* Database schema initialization mode.
152-
*/
153-
private DatabaseInitializationMode initializeSchema = DatabaseInitializationMode.EMBEDDED;
154-
155-
/**
156-
* Prefixes for single-line comments in SQL initialization scripts.
157-
*/
158-
private List<String> commentPrefix = new ArrayList<>(Arrays.asList("#", "--"));
159-
160-
public String getSchema() {
161-
return this.schema;
162-
}
163-
164-
public void setSchema(String schema) {
165-
this.schema = schema;
166-
}
167-
168-
public String getPlatform() {
169-
return this.platform;
170-
}
171-
172-
public void setPlatform(String platform) {
173-
this.platform = platform;
174-
}
175-
176-
public DatabaseInitializationMode getInitializeSchema() {
177-
return this.initializeSchema;
178-
}
179-
180-
public void setInitializeSchema(DatabaseInitializationMode initializeSchema) {
181-
this.initializeSchema = initializeSchema;
182-
}
183-
184-
public List<String> getCommentPrefix() {
185-
return this.commentPrefix;
186-
}
187-
188-
public void setCommentPrefix(List<String> commentPrefix) {
189-
this.commentPrefix = commentPrefix;
190-
}
191-
192-
}
193-
194124
}

0 commit comments

Comments
 (0)