Skip to content

Commit 3746631

Browse files
committed
Merge branch '2.1.x'
Closes gh-18085
2 parents caa4c16 + 0cfcbcb commit 3746631

File tree

2 files changed

+73
-9
lines changed

2 files changed

+73
-9
lines changed

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

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import javax.sql.DataSource;
2323

24+
import liquibase.integration.spring.SpringLiquibase;
2425
import org.quartz.Calendar;
2526
import org.quartz.JobDetail;
2627
import org.quartz.Scheduler;
@@ -30,11 +31,15 @@
3031
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
3132
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3233
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
34+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
3335
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
3436
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
3537
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
3638
import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
39+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
40+
import org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer;
3741
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
42+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
3843
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
3944
import org.springframework.boot.context.properties.EnableConfigurationProperties;
4045
import org.springframework.context.ApplicationContext;
@@ -56,7 +61,8 @@
5661
@Configuration(proxyBeanMethods = false)
5762
@ConditionalOnClass({ Scheduler.class, SchedulerFactoryBean.class, PlatformTransactionManager.class })
5863
@EnableConfigurationProperties(QuartzProperties.class)
59-
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class })
64+
@AutoConfigureAfter({ DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class,
65+
LiquibaseAutoConfiguration.class, FlywayAutoConfiguration.class })
6066
public class QuartzAutoConfiguration {
6167

6268
@Bean
@@ -123,22 +129,48 @@ public QuartzDataSourceInitializer quartzDataSourceInitializer(DataSource dataSo
123129
QuartzProperties properties) {
124130
DataSource dataSourceToUse = getDataSource(dataSource, quartzDataSource);
125131
return new QuartzDataSourceInitializer(dataSourceToUse, resourceLoader, properties);
126-
}
127132

128-
@Bean
129-
public static DataSourceInitializerSchedulerDependencyPostProcessor dataSourceInitializerSchedulerDependencyPostProcessor() {
130-
return new DataSourceInitializerSchedulerDependencyPostProcessor();
131133
}
132134

133-
private static class DataSourceInitializerSchedulerDependencyPostProcessor
134-
extends AbstractDependsOnBeanFactoryPostProcessor {
135+
/**
136+
* Additional configuration to ensure that {@link SchedulerFactoryBean} and
137+
* {@link Scheduler} beans depend on the {@link QuartzDataSourceInitializer}
138+
* bean(s).
139+
*/
140+
@Configuration(proxyBeanMethods = false)
141+
static class QuartzSchedulerDependencyConfiguration {
142+
143+
@Bean
144+
public static SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerDataSourceInitializerDependsOnBeanFactoryPostProcessor() {
145+
return new SchedulerDependsOnBeanFactoryPostProcessor(QuartzDataSourceInitializer.class);
146+
}
147+
148+
@Bean
149+
@ConditionalOnBean(FlywayMigrationInitializer.class)
150+
public static SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerFilywayDependsOnBeanFactoryPostProcessor() {
151+
return new SchedulerDependsOnBeanFactoryPostProcessor(FlywayMigrationInitializer.class);
152+
}
135153

136-
DataSourceInitializerSchedulerDependencyPostProcessor() {
137-
super(Scheduler.class, SchedulerFactoryBean.class, "quartzDataSourceInitializer");
154+
@Bean
155+
@ConditionalOnBean(SpringLiquibase.class)
156+
public static SchedulerDependsOnBeanFactoryPostProcessor quartzSchedulerLiquibaseDependsOnBeanFactoryPostProcessor() {
157+
return new SchedulerDependsOnBeanFactoryPostProcessor(SpringLiquibase.class);
138158
}
139159

140160
}
141161

142162
}
143163

164+
/**
165+
* {@link AbstractDependsOnBeanFactoryPostProcessor} for Quartz {@link Scheduler} and
166+
* {@link SchedulerFactoryBean}.
167+
*/
168+
private static class SchedulerDependsOnBeanFactoryPostProcessor extends AbstractDependsOnBeanFactoryPostProcessor {
169+
170+
SchedulerDependsOnBeanFactoryPostProcessor(Class<?>... dependencyTypes) {
171+
super(Scheduler.class, SchedulerFactoryBean.class, dependencyTypes);
172+
}
173+
174+
}
175+
144176
}

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/quartz/QuartzAutoConfigurationTests.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,16 @@
1616

1717
package org.springframework.boot.autoconfigure.quartz;
1818

19+
import java.io.InputStream;
20+
import java.nio.file.Files;
21+
import java.nio.file.Path;
1922
import java.util.concurrent.Executor;
2023

2124
import javax.sql.DataSource;
2225

2326
import org.junit.jupiter.api.Test;
2427
import org.junit.jupiter.api.extension.ExtendWith;
28+
import org.junit.jupiter.api.io.TempDir;
2529
import org.quartz.Calendar;
2630
import org.quartz.JobBuilder;
2731
import org.quartz.JobDetail;
@@ -39,9 +43,11 @@
3943

4044
import org.springframework.beans.factory.annotation.Autowired;
4145
import org.springframework.boot.autoconfigure.AutoConfigurations;
46+
import org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration;
4247
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
4348
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
4449
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
50+
import org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration;
4551
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
4652
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
4753
import org.springframework.boot.test.context.runner.ContextConsumer;
@@ -52,6 +58,7 @@
5258
import org.springframework.context.annotation.Import;
5359
import org.springframework.context.annotation.Primary;
5460
import org.springframework.core.env.Environment;
61+
import org.springframework.core.io.ClassPathResource;
5562
import org.springframework.jdbc.core.JdbcTemplate;
5663
import org.springframework.scheduling.quartz.LocalDataSourceJobStore;
5764
import org.springframework.scheduling.quartz.QuartzJobBean;
@@ -240,6 +247,31 @@ void withCustomConfiguration() {
240247
});
241248
}
242249

250+
@Test
251+
void withLiquibase() {
252+
this.contextRunner.withUserConfiguration(QuartzJobsConfiguration.class)
253+
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
254+
DataSourceTransactionManagerAutoConfiguration.class, LiquibaseAutoConfiguration.class))
255+
.withPropertyValues("spring.quartz.job-store-type=jdbc", "spring.quartz.jdbc.initialize-schema=never",
256+
"spring.liquibase.change-log=classpath:org/quartz/impl/jdbcjobstore/liquibase.quartz.init.xml")
257+
.run(assertDataSourceJobStore("dataSource"));
258+
}
259+
260+
@Test
261+
void withFlyway(@TempDir Path flywayLocation) throws Exception {
262+
ClassPathResource tablesResource = new ClassPathResource("org/quartz/impl/jdbcjobstore/tables_h2.sql");
263+
try (InputStream stream = tablesResource.getInputStream()) {
264+
Files.copy(stream, flywayLocation.resolve("V2__quartz.sql"));
265+
}
266+
this.contextRunner.withUserConfiguration(QuartzJobsConfiguration.class)
267+
.withConfiguration(AutoConfigurations.of(DataSourceAutoConfiguration.class,
268+
DataSourceTransactionManagerAutoConfiguration.class, FlywayAutoConfiguration.class))
269+
.withPropertyValues("spring.quartz.job-store-type=jdbc", "spring.quartz.jdbc.initialize-schema=never",
270+
"spring.flyway.locations=filesystem:" + flywayLocation,
271+
"spring.flyway.baseline-on-migrate=true")
272+
.run(assertDataSourceJobStore("dataSource"));
273+
}
274+
243275
@Test
244276
void schedulerNameWithDedicatedProperty() {
245277
this.contextRunner.withPropertyValues("spring.quartz.scheduler-name=testScheduler")

0 commit comments

Comments
 (0)