Browse Source

Add SpringApplication.setRegisterShutdownHook

Add a setRegisterShutdownHook option to SpringApplication allowing the
shutdown hook to not be registered.

Also update SpringApplicationBuilder to automatically disable shutdown
hooks for child contexts.

Fixes gh-314
pull/313/merge
Phillip Webb 12 years ago
parent
commit
75af7a44d0
  1. 13
      spring-boot/src/main/java/org/springframework/boot/SpringApplication.java
  2. 20
      spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java
  3. 11
      spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java
  4. 29
      spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java

13
spring-boot/src/main/java/org/springframework/boot/SpringApplication.java

@ -177,6 +177,8 @@ public class SpringApplication { @@ -177,6 +177,8 @@ public class SpringApplication {
private boolean headless = true;
private boolean registerShutdownHook = true;
private List<ApplicationContextInitializer<?>> initializers;
private List<ApplicationListener<?>> listeners;
@ -284,7 +286,9 @@ public class SpringApplication { @@ -284,7 +286,9 @@ public class SpringApplication {
// Create, load, refresh and run the ApplicationContext
context = createApplicationContext();
if (this.registerShutdownHook) {
context.registerShutdownHook();
}
context.setEnvironment(environment);
postProcessApplicationContext(context);
applyInitializers(context);
@ -669,6 +673,15 @@ public class SpringApplication { @@ -669,6 +673,15 @@ public class SpringApplication {
this.headless = headless;
}
/**
* Sets if the created {@link ApplicationContext} should have a shutdown hook
* registered. Defaults to {@code true} to ensure that JVM shutdowns are handled
* gracefully.
*/
public void setRegisterShutdownHook(boolean registerShutdownHook) {
this.registerShutdownHook = registerShutdownHook;
}
/**
* Sets if the Spring banner should be displayed when the application runs. Defaults
* to {@code true}.

20
spring-boot/src/main/java/org/springframework/boot/builder/SpringApplicationBuilder.java

@ -79,6 +79,8 @@ public class SpringApplicationBuilder { @@ -79,6 +79,8 @@ public class SpringApplicationBuilder {
private Set<String> additionalProfiles = new LinkedHashSet<String>();
private boolean registerShutdownHookApplied;
public SpringApplicationBuilder(Object... sources) {
this.application = new SpringApplication(sources);
}
@ -109,8 +111,11 @@ public class SpringApplicationBuilder { @@ -109,8 +111,11 @@ public class SpringApplicationBuilder {
public ConfigurableApplicationContext run(String... args) {
if (this.parent != null) {
// If there is a parent initialize it and make sure it is added to the current
// context
// If there is a parent don't register a shutdown hook
if (!this.registerShutdownHookApplied) {
this.application.setRegisterShutdownHook(false);
}
// initialize it and make sure it is added to the current context
initializers(new ParentContextApplicationContextInitializer(
this.parent.run(args)));
}
@ -201,6 +206,7 @@ public class SpringApplicationBuilder { @@ -201,6 +206,7 @@ public class SpringApplicationBuilder {
this.parent.context = parent;
this.parent.running.set(true);
initializers(new ParentContextApplicationContextInitializer(parent));
return this;
}
@ -300,6 +306,16 @@ public class SpringApplicationBuilder { @@ -300,6 +306,16 @@ public class SpringApplicationBuilder {
return this;
}
/**
* Sets if the created {@link ApplicationContext} should have a shutdown hook
* registered.
*/
public SpringApplicationBuilder registerShutdownHook(boolean registerShutdownHook) {
this.registerShutdownHookApplied = true;
this.application.setRegisterShutdownHook(registerShutdownHook);
return this;
}
/**
* Fixes the main application class that is used to anchor the startup messages.
* @param mainApplicationClass the class to use.

11
spring-boot/src/test/java/org/springframework/boot/SpringApplicationTests.java

@ -393,6 +393,17 @@ public class SpringApplicationTests { @@ -393,6 +393,17 @@ public class SpringApplicationTests {
verify(applicationContext.getApplicationContext()).registerShutdownHook();
}
@Test
public void registerShutdownHookOff() throws Exception {
SpringApplication application = new SpringApplication(ExampleConfig.class);
application.setApplicationContextClass(SpyApplicationContext.class);
application.setRegisterShutdownHook(false);
this.context = application.run();
SpyApplicationContext applicationContext = (SpyApplicationContext) this.context;
verify(applicationContext.getApplicationContext(), never())
.registerShutdownHook();
}
@Test
public void headless() throws Exception {
TestSpringApplication application = new TestSpringApplication(ExampleConfig.class);

29
spring-boot/src/test/java/org/springframework/boot/builder/SpringApplicationBuilderTests.java

@ -108,6 +108,21 @@ public class SpringApplicationBuilderTests { @@ -108,6 +108,21 @@ public class SpringApplicationBuilderTests {
this.context = application.run();
verify(((SpyApplicationContext) this.context).getApplicationContext()).setParent(
any(ApplicationContext.class));
assertThat(((SpyApplicationContext) this.context).getRegisteredShutdownHook(),
equalTo(false));
}
@Test
public void parentContextCreationWithChildShutdown() throws Exception {
SpringApplicationBuilder application = new SpringApplicationBuilder(
ChildConfig.class).contextClass(SpyApplicationContext.class)
.registerShutdownHook(true);
application.parent(ExampleConfig.class);
this.context = application.run();
verify(((SpyApplicationContext) this.context).getApplicationContext()).setParent(
any(ApplicationContext.class));
assertThat(((SpyApplicationContext) this.context).getRegisteredShutdownHook(),
equalTo(true));
}
@Test
@ -143,6 +158,8 @@ public class SpringApplicationBuilderTests { @@ -143,6 +158,8 @@ public class SpringApplicationBuilderTests {
this.context = application.run();
verify(((SpyApplicationContext) this.context).getApplicationContext()).setParent(
any(ApplicationContext.class));
assertThat(((SpyApplicationContext) this.context).getRegisteredShutdownHook(),
equalTo(false));
}
@Test
@ -216,8 +233,11 @@ public class SpringApplicationBuilderTests { @@ -216,8 +233,11 @@ public class SpringApplicationBuilderTests {
public static class SpyApplicationContext extends AnnotationConfigApplicationContext {
private final ConfigurableApplicationContext applicationContext = spy(new AnnotationConfigApplicationContext());
private ResourceLoader resourceLoader;
private boolean registeredShutdownHook;
@Override
public void setParent(ApplicationContext parent) {
this.applicationContext.setParent(parent);
@ -237,5 +257,14 @@ public class SpringApplicationBuilderTests { @@ -237,5 +257,14 @@ public class SpringApplicationBuilderTests {
return this.resourceLoader;
}
@Override
public void registerShutdownHook() {
super.registerShutdownHook();
this.registeredShutdownHook = true;
}
public boolean getRegisteredShutdownHook() {
return this.registeredShutdownHook;
}
}
}

Loading…
Cancel
Save