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());