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 02568a0140..836d6b14f2 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 9f79be5b76..037931796b 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.context.ApplicationContextException; import org.springframework.context.ApplicationListener; import org.springframework.context.support.AbstractApplicationContext; @@ -54,6 +57,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; @@ -429,6 +433,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)); @@ -478,4 +498,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 6debacdb9f..dcbdcdb67b 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; @@ -188,6 +190,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() {