Call ServletContextListener.contextDestroyed() when Undertow is stopped

Previously, when the embedded Undertow container was stopped, the
servlet deployment was stopped but it was not undeployed. This meant
that contextDestroyed() callback of any registered
ServletContextListeners was not called.

This commit updates UndertowEmbeddedServletContainer to call undeploy
on the deployment manager in addition to the existing call to stop.
Undeploying the servlet deployment calls Undertow to drive the
contextDestroyed callback on any registered ServletContextListeners.

Closes gh-13134
This commit is contained in:
Andy Wilkinson 2018-05-14 19:48:45 +01:00
parent f07daf898b
commit 339fd74810
2 changed files with 24 additions and 0 deletions

View File

@ -333,6 +333,7 @@ public class UndertowEmbeddedServletContainer implements EmbeddedServletContaine
this.started = false;
try {
this.manager.stop();
this.manager.undeploy();
this.undertow.stop();
}
catch (Exception ex) {

View File

@ -55,6 +55,8 @@ import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.servlet.GenericServlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
@ -110,6 +112,7 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.fail;
import static org.mockito.BDDMockito.given;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.inOrder;
import static org.mockito.Mockito.mock;
@ -1035,6 +1038,26 @@ public abstract class AbstractEmbeddedServletContainerFactoryTests {
assertThat(documentRoot).isNull();
}
@Test
public void servletContextListenerContextDestroyedIsCalledWhenContainerIsStopped()
throws Exception {
final ServletContextListener listener = mock(ServletContextListener.class);
AbstractEmbeddedServletContainerFactory factory = getFactory();
this.container = factory
.getEmbeddedServletContainer(new ServletContextInitializer() {
@Override
public void onStartup(ServletContext servletContext)
throws ServletException {
servletContext.addListener(listener);
}
});
this.container.start();
this.container.stop();
verify(listener).contextDestroyed(any(ServletContextEvent.class));
}
protected abstract void addConnector(int port,
AbstractEmbeddedServletContainerFactory factory);