Author: rmannibucau
Date: Wed Feb 19 06:51:19 2014
New Revision: 1569651

URL: http://svn.apache.org/r1569651
Log:
trying to get a better cleanup of tomcat classloader whatever the way we 
undeploy the app

Modified:
    
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
    
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java

Modified: 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1569651&r1=1569650&r2=1569651&view=diff
==============================================================================
--- 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 (original)
+++ 
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
 Wed Feb 19 06:51:19 2014
@@ -16,6 +16,7 @@
  */
 package org.apache.openejb.assembler.classic;
 
+import org.apache.catalina.LifecycleException;
 import org.apache.geronimo.connector.GeronimoBootstrapContext;
 import org.apache.geronimo.connector.outbound.AbstractConnectionManager;
 import org.apache.geronimo.connector.work.GeronimoWorkManager;
@@ -1519,6 +1520,7 @@ public class Assembler extends Assembler
 
             final Context globalContext = containerSystem.getJNDIContext();
             final AppContext appContext = 
containerSystem.getAppContext(appInfo.appId);
+            final ClassLoader classLoader = appContext.getClassLoader();
 
             if (null == appContext) {
                 logger.warning("Application id '" + appInfo.appId + "' not 
found in: " + Arrays.toString(containerSystem.getAppContextKeys()));
@@ -1527,7 +1529,7 @@ public class Assembler extends Assembler
                 final WebBeansContext webBeansContext = 
appContext.getWebBeansContext();
                 if (webBeansContext != null) {
                     final ClassLoader old = 
Thread.currentThread().getContextClassLoader();
-                    
Thread.currentThread().setContextClassLoader(appContext.getClassLoader());
+                    Thread.currentThread().setContextClassLoader(classLoader);
                     try {
                         
webBeansContext.getService(ContainerLifecycle.class).stopApplication(null);
                     } finally {
@@ -1647,7 +1649,7 @@ public class Assembler extends Assembler
                 for (final WebContext webContext : 
appContext.getWebContexts()) {
                     containerSystem.removeWebContext(webContext);
                 }
-                TldScanner.forceCompleteClean(appContext.getClassLoader());
+                TldScanner.forceCompleteClean(classLoader);
             }
 
             // Clear out naming for all components first
@@ -1792,6 +1794,17 @@ public class Assembler extends Assembler
 
             containerSystem.removeAppContext(appInfo.appId);
 
+            if (!appInfo.properties.containsKey("tomee.destroying")) { // 
destroy tomee classloader after resources cleanup
+                try {
+                    final Method m = 
classLoader.getClass().getMethod("internalStop");
+                    m.invoke(classLoader);
+                } catch (final NoSuchMethodException nsme) {
+                    // no-op
+                } catch (final Exception e) {
+                    logger.error("error stopping classloader of webapp " + 
appInfo.appId, e);
+                }
+                ClassLoaderUtil.cleanOpenJPACache(classLoader);
+            }
             ClassLoaderUtil.destroyClassLoader(appInfo.appId, appInfo.path);
 
             if (undeployException.getCauses().size() > 0) {

Modified: 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1569651&r1=1569650&r2=1569651&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
 Wed Feb 19 06:51:19 2014
@@ -1802,8 +1802,7 @@ public class TomcatWebAppBuilder impleme
     }
 
     private boolean isUnDeployable(final ContextInfo contextInfo) {
-        return contextInfo != null && contextInfo.appInfo != null && 
contextInfo.deployer == null && contextInfo.appInfo.webAppAlone
-                && 
getAssembler().getDeployedApplications().contains(contextInfo.appInfo);
+        return contextInfo.appInfo != null && contextInfo.deployer == null && 
contextInfo.appInfo.webAppAlone;
     }
 
     /**
@@ -1830,23 +1829,29 @@ public class TomcatWebAppBuilder impleme
         }
 
         final ContextInfo contextInfo = getContextInfo(standardContext);
-        if (isUnDeployable(contextInfo)) {
+        boolean destroyFromTomcat = contextInfo != null && 
getAssembler().getDeployedApplications().contains(contextInfo.appInfo);
+        if (destroyFromTomcat && isUnDeployable(contextInfo)) {
+            contextInfo.appInfo.properties.setProperty("tomee.destroying", 
"true");
             try {
                 getAssembler().destroyApplication(contextInfo.appInfo.path);
             } catch (final Exception e) {
                 logger.error("Unable to stop web application " + 
standardContext.getPath() + ": Exception: " + e.getMessage(), e);
             }
+        } else {
+            destroyFromTomcat = false;
         }
 
         NamingUtil.cleanUpContextResource(standardContext);
 
         if (old != null) {
-            try {
-                old.internalStop();
-            } catch (final LifecycleException e) {
-                logger.error("error stopping classloader of webapp " + 
standardContext.getName(), e);
+            if (destroyFromTomcat) {
+                try {
+                    old.internalStop();
+                } catch (final LifecycleException e) {
+                    logger.error("error stopping classloader of webapp " + 
standardContext.getName(), e);
+                }
+                ClassLoaderUtil.cleanOpenJPACache(old);
             }
-            ClassLoaderUtil.cleanOpenJPACache(old);
             instanceManagers.remove(old);
         } else if (standardContext.getLoader() != null && 
standardContext.getLoader().getClassLoader() != null) {
             
instanceManagers.remove(standardContext.getLoader().getClassLoader());


Reply via email to