diff --git a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java index 86c6f7d5e43..553b4df1375 100644 --- a/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java +++ b/spring-boot/src/main/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContext.java @@ -146,8 +146,8 @@ public class EmbeddedWebApplicationContext extends GenericWebApplicationContext @Override protected void doClose() { - super.doClose(); stopAndReleaseEmbeddedServletContainer(); + super.doClose(); } private synchronized void createEmbeddedServletContainer() { diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContextTests.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContextTests.java index 549dac852af..999a0d31730 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContextTests.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/EmbeddedWebApplicationContextTests.java @@ -36,11 +36,14 @@ import org.junit.Test; import org.junit.rules.ExpectedException; import org.mockito.InOrder; import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.ConstructorArgumentValues; import org.springframework.beans.factory.config.Scope; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.boot.context.embedded.MockEmbeddedServletContainerFactory.MockEmbeddedServletContainer; import org.springframework.boot.context.web.ServerPortInfoApplicationContextInitializer; import org.springframework.context.ApplicationContextException; import org.springframework.context.ApplicationListener; @@ -56,6 +59,7 @@ import org.springframework.web.filter.GenericFilterBean; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; import static org.hamcrest.Matchers.sameInstance; import static org.junit.Assert.assertEquals; @@ -442,6 +446,22 @@ public class EmbeddedWebApplicationContextTests { sameInstance(scope)); } + @Test + public void containerIsStoppedBeforeContextIsClosed() { + addEmbeddedServletContainerFactoryBean(); + this.context.registerBeanDefinition("shutdownOrderingValidator", + BeanDefinitionBuilder.rootBeanDefinition(ShutdownOrderingValidator.class) + .addConstructorArgReference("embeddedServletContainerFactory") + .getBeanDefinition()); + this.context.refresh(); + ShutdownOrderingValidator validator = this.context + .getBean(ShutdownOrderingValidator.class); + this.context.close(); + assertThat(validator.destroyed, is(true)); + assertThat(validator.containerStoppedFirst, is(true)); + + } + private void addEmbeddedServletContainerFactoryBean() { this.context.registerBeanDefinition("embeddedServletContainerFactory", new RootBeanDefinition(MockEmbeddedServletContainerFactory.class)); @@ -491,4 +511,25 @@ public class EmbeddedWebApplicationContextTests { } + protected static class ShutdownOrderingValidator implements DisposableBean { + + private final MockEmbeddedServletContainer servletContainer; + + private boolean destroyed = false; + + private boolean containerStoppedFirst = false; + + ShutdownOrderingValidator( + MockEmbeddedServletContainerFactory servletContainerFactory) { + this.servletContainer = servletContainerFactory.getContainer(); + } + + @Override + public void destroy() { + this.destroyed = true; + this.containerStoppedFirst = this.servletContainer.isStopped(); + } + + } + } diff --git a/spring-boot/src/test/java/org/springframework/boot/context/embedded/MockEmbeddedServletContainerFactory.java b/spring-boot/src/test/java/org/springframework/boot/context/embedded/MockEmbeddedServletContainerFactory.java index 4e3b78b5937..f3345c14e40 100644 --- a/spring-boot/src/test/java/org/springframework/boot/context/embedded/MockEmbeddedServletContainerFactory.java +++ b/spring-boot/src/test/java/org/springframework/boot/context/embedded/MockEmbeddedServletContainerFactory.java @@ -90,6 +90,8 @@ public class MockEmbeddedServletContainerFactory private final int port; + private boolean stopped = false; + public MockEmbeddedServletContainer(ServletContextInitializer[] initializers, int port) { this.initializers = initializers; @@ -174,6 +176,11 @@ public class MockEmbeddedServletContainerFactory public void stop() { this.servletContext = null; this.registeredServlets.clear(); + this.stopped = true; + } + + public boolean isStopped() { + return this.stopped; } public Servlet[] getServlets() {