TOMEE-1694 use tomcat destroy hook
Project: http://git-wip-us.apache.org/repos/asf/tomee/repo Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/532ee1be Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/532ee1be Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/532ee1be Branch: refs/heads/tomee-1.7.x Commit: 532ee1be14c1c5ecad1ba8052a154dc9876ccafa Parents: dbb8479 Author: Romain Manni-Bucau <[email protected]> Authored: Mon Jan 18 19:50:16 2016 +0100 Committer: Jonathan Gallimore <[email protected]> Committed: Thu Mar 29 16:56:12 2018 +0100 ---------------------------------------------------------------------- .../tomee/catalina/JavaeeInstanceManager.java | 45 +++++++++++++++++++- 1 file changed, 43 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tomee/blob/532ee1be/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java ---------------------------------------------------------------------- diff --git a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java index 3a8d6a7..9efedec 100644 --- a/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java +++ b/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/JavaeeInstanceManager.java @@ -18,6 +18,7 @@ package org.apache.tomee.catalina; import org.apache.openejb.OpenEJBException; import org.apache.openejb.core.WebContext; +import org.apache.openejb.loader.SystemInstance; import org.apache.tomcat.InstanceManager; import org.apache.webbeans.exception.WebBeansConfigurationException; import org.apache.webbeans.exception.WebBeansCreationException; @@ -85,8 +86,17 @@ public class JavaeeInstanceManager implements InstanceManager { if (o == null) { return; } - preDestroy(o, o.getClass()); - webContext.destroy(o); + final Object unwrapped = unwrap(o); + preDestroy(unwrapped, unwrapped.getClass()); + webContext.destroy(unwrapped); + if (unwrapped != o) { // PojoEndpointServer, they create and track a cc so release it + webContext.destroy(o); + } + } + + private Object unwrap(final Object o) { + return "org.apache.tomcat.websocket.pojo.PojoEndpointServer".equals(o.getClass().getName()) ? + WebSocketTypes.unwrapWebSocketPojo(o) : o; } public void inject(final Object o) { @@ -187,4 +197,35 @@ public class JavaeeInstanceManager implements InstanceManager { } } + private static class WebSocketTypes { // extracted for lazy loading + private static final WebSocketTypes WEB_SOCKET_TYPES = new WebSocketTypes(); + private final Method getPojo; + + private WebSocketTypes() { + Method tmp; + try { + tmp = WebSocketTypes.class.getClassLoader() + .loadClass("org.apache.tomcat.websocket.pojo.PojoEndpointBase") + .getDeclaredMethod("getPojo"); + tmp.setAccessible(true); + } catch (final NoSuchMethodException e) { + if ("true".equals(SystemInstance.get().getProperty("tomee.websocket.skip", "false"))) { + tmp = null; + } else { + throw new IllegalStateException(e); + } + } catch (final ClassNotFoundException e) { + tmp = null; // no websocket support + } + getPojo = tmp; + } + + private static Object unwrapWebSocketPojo(final Object o) { + try { + return WEB_SOCKET_TYPES.getPojo == null ? o : WEB_SOCKET_TYPES.getPojo.invoke(o); + } catch (final IllegalAccessException | InvocationTargetException | NullPointerException e) { + return o; + } + } + } }
