Skip to content

Commit f61ad19

Browse files
committed
Merge pull request #9411 from vpavic:improve-quartz-support
* pr/9411: Polish contribution Ensure `QuartzDatabaseInitializer` is initialized before `Scheduler`
2 parents b16fdaf + 7f420d1 commit f61ad19

File tree

3 files changed

+50
-17
lines changed

3 files changed

+50
-17
lines changed

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

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.quartz.Trigger;
3030

3131
import org.springframework.beans.factory.ObjectProvider;
32+
import org.springframework.boot.autoconfigure.AbstractDependsOnBeanFactoryPostProcessor;
3233
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
3334
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
3435
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -87,14 +88,6 @@ public QuartzAutoConfiguration(QuartzProperties properties,
8788
this.applicationContext = applicationContext;
8889
}
8990

90-
@Bean
91-
@ConditionalOnSingleCandidate(DataSource.class)
92-
@ConditionalOnMissingBean
93-
public QuartzDatabaseInitializer quartzDatabaseInitializer(DataSource dataSource,
94-
ResourceLoader resourceLoader) {
95-
return new QuartzDatabaseInitializer(dataSource, resourceLoader, this.properties);
96-
}
97-
9891
@Bean
9992
@ConditionalOnMissingBean
10093
public SchedulerFactoryBean quartzScheduler() {
@@ -155,6 +148,28 @@ public SchedulerFactoryBeanCustomizer dataSourceCustomizer(
155148
};
156149
}
157150

151+
@Bean
152+
@ConditionalOnMissingBean
153+
public QuartzDatabaseInitializer quartzDatabaseInitializer(DataSource dataSource,
154+
ResourceLoader resourceLoader, QuartzProperties properties) {
155+
return new QuartzDatabaseInitializer(dataSource, resourceLoader, properties);
156+
}
157+
158+
@Bean
159+
public static DatabaseInitializerSchedulerDependencyPostProcessor databaseInitializerSchedulerDependencyPostProcessor() {
160+
return new DatabaseInitializerSchedulerDependencyPostProcessor();
161+
}
162+
163+
private static class DatabaseInitializerSchedulerDependencyPostProcessor
164+
extends AbstractDependsOnBeanFactoryPostProcessor {
165+
166+
DatabaseInitializerSchedulerDependencyPostProcessor() {
167+
super(Scheduler.class, SchedulerFactoryBean.class,
168+
"quartzDatabaseInitializer");
169+
}
170+
171+
}
172+
158173
}
159174

160175
}

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

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@
5050
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
5151
import org.springframework.context.annotation.Bean;
5252
import org.springframework.context.annotation.Configuration;
53+
import org.springframework.context.annotation.Import;
5354
import org.springframework.core.env.Environment;
5455
import org.springframework.jdbc.core.JdbcTemplate;
5556
import org.springframework.scheduling.quartz.LocalDataSourceJobStore;
5657
import org.springframework.scheduling.quartz.LocalTaskExecutorThreadPool;
5758
import org.springframework.scheduling.quartz.QuartzJobBean;
59+
import org.springframework.util.Assert;
5860
import org.springframework.util.ObjectUtils;
5961

6062
import static org.assertj.core.api.Assertions.assertThat;
@@ -174,7 +176,7 @@ public void withQuartzProperties() throws Exception {
174176

175177
@Test
176178
public void withCustomizer() throws Exception {
177-
load(QuartzCustomConfig.class);
179+
load(QuartzCustomConfiguration.class);
178180
assertThat(this.context.getBeansOfType(Scheduler.class)).hasSize(1);
179181
Scheduler scheduler = this.context.getBean(Scheduler.class);
180182
assertThat(scheduler.getSchedulerName()).isEqualTo("fooScheduler");
@@ -199,8 +201,14 @@ private void load(Class<?>[] configs, String... environment) {
199201
this.context = ctx;
200202
}
201203

204+
@Import(ComponentThatUsesScheduler.class)
202205
@Configuration
203-
protected static class QuartzJobsConfiguration {
206+
protected static class BaseQuartzConfiguration {
207+
208+
}
209+
210+
@Configuration
211+
protected static class QuartzJobsConfiguration extends BaseQuartzConfiguration {
204212

205213
@Bean
206214
public JobDetail fooJob() {
@@ -217,7 +225,7 @@ public JobDetail barJob() {
217225
}
218226

219227
@Configuration
220-
protected static class QuartzFullConfiguration {
228+
protected static class QuartzFullConfiguration extends BaseQuartzConfiguration {
221229

222230
@Bean
223231
public JobDetail fooJob() {
@@ -237,7 +245,7 @@ public Trigger fooTrigger() {
237245
}
238246

239247
@Configuration
240-
protected static class QuartzCalendarsConfiguration {
248+
protected static class QuartzCalendarsConfiguration extends BaseQuartzConfiguration {
241249

242250
@Bean
243251
public Calendar weekly() {
@@ -252,7 +260,7 @@ public Calendar monthly() {
252260
}
253261

254262
@Configuration
255-
protected static class QuartzExecutorConfiguration {
263+
protected static class QuartzExecutorConfiguration extends BaseQuartzConfiguration {
256264

257265
@Bean
258266
public Executor executor() {
@@ -262,7 +270,7 @@ public Executor executor() {
262270
}
263271

264272
@Configuration
265-
protected static class QuartzCustomConfig {
273+
protected static class QuartzCustomConfiguration extends BaseQuartzConfiguration {
266274

267275
@Bean
268276
public SchedulerFactoryBeanCustomizer customizer() {
@@ -272,6 +280,17 @@ public SchedulerFactoryBeanCustomizer customizer() {
272280

273281
}
274282

283+
public static class ComponentThatUsesScheduler {
284+
285+
private Scheduler scheduler;
286+
287+
public ComponentThatUsesScheduler(Scheduler scheduler) {
288+
Assert.notNull(scheduler, "Scheduler must not be null");
289+
this.scheduler = scheduler;
290+
}
291+
292+
}
293+
275294
public static class FooJob extends QuartzJobBean {
276295

277296
@Autowired

spring-boot-samples/spring-boot-sample-quartz/src/main/java/sample/quartz/SampleQuartzApplication.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,8 @@ public static void main(String[] args) {
3535

3636
@Bean
3737
public JobDetail sampleJobDetail() {
38-
return JobBuilder.newJob().ofType(SampleJob.class).withIdentity("sampleJob")
39-
.usingJobData("name", "World")
40-
.storeDurably().build();
38+
return JobBuilder.newJob(SampleJob.class).withIdentity("sampleJob")
39+
.usingJobData("name", "World").storeDurably().build();
4140
}
4241

4342
@Bean

0 commit comments

Comments
 (0)