Allow Quartz property to set the scheduler name

This commit makes sure that "org.quartz.scheduler.instanceName" is
honoured if set. Previously, "spring.quartz.scheduler-name" had a
default value and was always set. As a result, `SchedulerFactoryBean`
did not take the quartz property into account.

Closes gh-14243
This commit is contained in:
Stephane Nicoll 2018-09-20 11:27:57 +02:00
parent d10ba39673
commit 8652f40781
4 changed files with 50 additions and 7 deletions

View File

@ -90,7 +90,9 @@ public class QuartzAutoConfiguration {
SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
schedulerFactoryBean.setJobFactory(new AutowireCapableBeanJobFactory(
this.applicationContext.getAutowireCapableBeanFactory()));
schedulerFactoryBean.setBeanName(this.properties.getSchedulerName());
if (this.properties.getSchedulerName() != null) {
schedulerFactoryBean.setSchedulerName(this.properties.getSchedulerName());
}
schedulerFactoryBean.setAutoStartup(this.properties.isAutoStartup());
schedulerFactoryBean
.setStartupDelay((int) this.properties.getStartupDelay().getSeconds());

View File

@ -41,7 +41,7 @@ public class QuartzProperties {
/**
* Name of the scheduler.
*/
private String schedulerName = "quartzScheduler";
private String schedulerName;
/**
* Whether to automatically start the scheduler after initialization.

View File

@ -504,6 +504,11 @@
"level" : "error"
}
},
{
"name": "spring.quartz.scheduler-name",
"type": "java.lang.String",
"defaultValue": "quartzScheduler"
},
{
"name": "spring.quartz.jdbc.initialize-schema",
"defaultValue": "embedded"

View File

@ -250,17 +250,14 @@ public class QuartzAutoConfigurationTests {
@Test
public void withCustomConfiguration() {
this.contextRunner.withPropertyValues(
"spring.quartz.scheduler-name=testScheduler",
"spring.quartz.auto-startup=false", "spring.quartz.startup-delay=1m",
this.contextRunner.withPropertyValues("spring.quartz.auto-startup=false",
"spring.quartz.startup-delay=1m",
"spring.quartz.wait-for-jobs-to-complete-on-shutdown=true",
"spring.quartz.overwrite-existing-jobs=true").run((context) -> {
assertThat(context).hasSingleBean(SchedulerFactoryBean.class);
SchedulerFactoryBean schedulerFactory = context
.getBean(SchedulerFactoryBean.class);
DirectFieldAccessor dfa = new DirectFieldAccessor(schedulerFactory);
assertThat(dfa.getPropertyValue("schedulerName"))
.isEqualTo("testScheduler");
assertThat(schedulerFactory.isAutoStartup()).isFalse();
assertThat(dfa.getPropertyValue("startupDelay")).isEqualTo(60);
assertThat(dfa.getPropertyValue("waitForJobsToCompleteOnShutdown"))
@ -270,6 +267,45 @@ public class QuartzAutoConfigurationTests {
});
}
@Test
public void schedulerNameWithDedicatedProperty() {
this.contextRunner
.withPropertyValues("spring.quartz.scheduler-name=testScheduler")
.run(assertSchedulerName("testScheduler"));
}
@Test
public void schedulerNameWithQuartzProperty() {
this.contextRunner.withPropertyValues(
"spring.quartz.properties.org.quartz.scheduler.instanceName=testScheduler")
.run(assertSchedulerName("testScheduler"));
}
@Test
public void schedulerNameWithDedicatedPropertyTakesPrecedence() {
this.contextRunner.withPropertyValues(
"spring.quartz.scheduler-name=specificTestScheduler",
"spring.quartz.properties.org.quartz.scheduler.instanceName=testScheduler")
.run(assertSchedulerName("specificTestScheduler"));
}
@Test
public void schedulerNameUseBeanNameByDefault() {
this.contextRunner.withPropertyValues()
.run(assertSchedulerName("quartzScheduler"));
}
private ContextConsumer<AssertableApplicationContext> assertSchedulerName(
String schedulerName) {
return (context) -> {
assertThat(context).hasSingleBean(SchedulerFactoryBean.class);
SchedulerFactoryBean schedulerFactory = context
.getBean(SchedulerFactoryBean.class);
DirectFieldAccessor dfa = new DirectFieldAccessor(schedulerFactory);
assertThat(dfa.getPropertyValue("schedulerName")).isEqualTo(schedulerName);
};
}
@Import(ComponentThatUsesScheduler.class)
@Configuration
protected static class BaseQuartzConfiguration {