diff options
author | Jan Bartel | 2016-01-07 00:11:10 +0000 |
---|---|---|
committer | Jan Bartel | 2016-01-07 00:12:11 +0000 |
commit | a8193c0eb8cedd92ce3b25ea0b7512fb969b3915 (patch) | |
tree | 01fcdc9cfadd2d9eaf19c2ec3decad1cf37a2752 /jetty-websocket/javax-websocket-server-impl | |
parent | b47990189c751c2acf6cd4042f8b19ebecb1e799 (diff) | |
download | org.eclipse.jetty.project-a8193c0eb8cedd92ce3b25ea0b7512fb969b3915.tar.gz org.eclipse.jetty.project-a8193c0eb8cedd92ce3b25ea0b7512fb969b3915.tar.xz org.eclipse.jetty.project-a8193c0eb8cedd92ce3b25ea0b7512fb969b3915.zip |
485063 After stopping JettyWebAppContext, it still contains reference to old WebAppClassLoader via ServerContainer bean
Diffstat (limited to 'jetty-websocket/javax-websocket-server-impl')
-rw-r--r-- | jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java | 48 |
1 files changed, 42 insertions, 6 deletions
diff --git a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java index f98c53666c..9e1090f692 100644 --- a/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java +++ b/jetty-websocket/javax-websocket-server-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/server/deploy/WebSocketServerContainerInitializer.java @@ -23,6 +23,8 @@ import java.util.Set; import javax.servlet.ServletContainerInitializer; import javax.servlet.ServletContext; +import javax.servlet.ServletContextEvent; +import javax.servlet.ServletContextListener; import javax.servlet.ServletException; import javax.servlet.annotation.HandlesTypes; import javax.websocket.DeploymentException; @@ -47,6 +49,39 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit public static final String ENABLE_KEY = "org.eclipse.jetty.websocket.jsr356"; private static final Logger LOG = Log.getLogger(WebSocketServerContainerInitializer.class); + + /** + * DestroyListener + * + * + */ + public static class ContextDestroyListener implements ServletContextListener + { + @Override + public void contextInitialized(ServletContextEvent sce) + { + //noop + } + + @Override + public void contextDestroyed(ServletContextEvent sce) + { + //remove any ServerContainer beans + if (sce.getServletContext() instanceof ContextHandler.Context) + { + ContextHandler handler = ((ContextHandler.Context)sce.getServletContext()).getContextHandler(); + ServerContainer bean = handler.getBean(ServerContainer.class); + if (bean != null) + handler.removeBean(bean); + } + + //remove reference in attributes + sce.getServletContext().removeAttribute(javax.websocket.server.ServerContainer.class.getName()); + } + } + + + /** * Jetty Native approach. * <p> @@ -63,7 +98,7 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit // Create the Jetty ServerContainer implementation ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),context.getServer().getThreadPool()); - context.addBean(jettyContainer); + context.addBean(jettyContainer, true); // Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer); @@ -88,7 +123,7 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit // Create the Jetty ServerContainer implementation ServerContainer jettyContainer = new ServerContainer(filter,filter.getFactory(),jettyContext.getServer().getThreadPool()); - jettyContext.addBean(jettyContainer); + jettyContext.addBean(jettyContainer, true); // Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer); @@ -171,9 +206,8 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit // Create the Jetty ServerContainer implementation ServerContainer jettyContainer = configureContext(context,jettyContext); - - // Store a reference to the ServerContainer per javax.websocket spec 1.0 final section 6.4 Programmatic Server Deployment - context.setAttribute(javax.websocket.server.ServerContainer.class.getName(),jettyContainer); + + context.addListener(new ContextDestroyListener()); //make sure context is cleaned up when the context stops // Establish the DecoratedObjectFactory thread local // for various ServiceLoader initiated components to use. @@ -278,7 +312,9 @@ public class WebSocketServerContainerInitializer implements ServletContainerInit throw new ServletException(e); } } - } finally { + } + finally + { Thread.currentThread().setContextClassLoader(old); } } |