Author: rmannibucau
Date: Sun Jun 3 20:23:44 2012
New Revision: 1345767
URL: http://svn.apache.org/viewvc?rev=1345767&view=rev
Log:
TOMEE-213 closing lazily the webappclassloader keeping the webappp lifecycle
Added:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1345767&r1=1345766&r2=1345767&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
Sun Jun 3 20:23:44 2012
@@ -1138,35 +1138,6 @@ public class Assembler extends Assembler
destroyApplication(appInfo);
}
- public synchronized void preDestroyApplication(AppInfo appInfo,
UndeployException ue) throws UndeployException {
- UndeployException undeployException = ue;
- if (undeployException == null) {
- undeployException = new UndeployException("can't unregister
persistence units");
- }
-
- final Context globalContext = containerSystem.getJNDIContext();
- for (PersistenceUnitInfo unitInfo : appInfo.persistenceUnits) {
- try {
- Object object =
globalContext.lookup(PERSISTENCE_UNIT_NAMING_CONTEXT + unitInfo.id);
- globalContext.unbind(PERSISTENCE_UNIT_NAMING_CONTEXT +
unitInfo.id);
-
- // close EMF so all resources are released
- ReloadableEntityManagerFactory remf =
((ReloadableEntityManagerFactory) object);
- remf.close();
- persistenceClassLoaderHandler.destroy(unitInfo.id);
- remf.unregister();
- } catch (Throwable t) {
- undeployException.getCauses().add(new
Exception("persistence-unit: " + unitInfo.id + ": " + t.getMessage(), t));
- }
- }
-
- appInfo.persistenceUnits.clear();
-
- if (undeployException.getCauses().size() > 0) {
- throw undeployException;
- }
- }
-
public synchronized void destroyApplication(AppInfo appInfo) throws
UndeployException {
deployedApplications.remove(appInfo.path);
logger.info("destroyApplication.start", appInfo.path);
@@ -1206,8 +1177,6 @@ public class Assembler extends Assembler
Context globalContext = containerSystem.getJNDIContext();
UndeployException undeployException = new
UndeployException(messages.format("destroyApplication.failed", appInfo.path));
- preDestroyApplication(appInfo, undeployException);
-
WebAppBuilder webAppBuilder =
SystemInstance.get().getComponent(WebAppBuilder.class);
if (webAppBuilder != null) {
try {
@@ -1371,6 +1340,21 @@ public class Assembler extends Assembler
}
}
+ for (PersistenceUnitInfo unitInfo : appInfo.persistenceUnits) {
+ try {
+ Object object =
globalContext.lookup(PERSISTENCE_UNIT_NAMING_CONTEXT + unitInfo.id);
+ globalContext.unbind(PERSISTENCE_UNIT_NAMING_CONTEXT +
unitInfo.id);
+
+ // close EMF so all resources are released
+ ReloadableEntityManagerFactory remf =
((ReloadableEntityManagerFactory) object);
+ remf.close();
+ persistenceClassLoaderHandler.destroy(unitInfo.id);
+ remf.unregister();
+ } catch (Throwable t) {
+ undeployException.getCauses().add(new
Exception("persistence-unit: " + unitInfo.id + ": " + t.getMessage(), t));
+ }
+ }
+
containerSystem.removeAppContext(appInfo.appId);
ClassLoaderUtil.destroyClassLoader(appInfo.path);
Added:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java?rev=1345767&view=auto
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
(added)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopLoader.java
Sun Jun 3 20:23:44 2012
@@ -0,0 +1,139 @@
+package org.apache.tomee.catalina;
+
+import java.beans.PropertyChangeListener;
+import org.apache.catalina.Container;
+import org.apache.catalina.Lifecycle;
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.LifecycleState;
+import org.apache.catalina.Loader;
+import org.apache.catalina.loader.WebappLoader;
+
+public class LazyStopLoader implements Loader, Lifecycle {
+ private final WebappLoader delegate;
+ private ClassLoader classLoader;
+
+ public LazyStopLoader(WebappLoader loader) {
+ delegate = loader;
+ }
+
+ @Override
+ public void addLifecycleListener(LifecycleListener listener) {
+ delegate.addLifecycleListener(listener);
+ }
+
+ @Override
+ public LifecycleListener[] findLifecycleListeners() {
+ return delegate.findLifecycleListeners();
+ }
+
+ @Override
+ public void removeLifecycleListener(LifecycleListener listener) {
+ delegate.removeLifecycleListener(listener);
+ }
+
+ @Override
+ public void init() throws LifecycleException {
+ delegate.init();
+ }
+
+ @Override
+ public void start() throws LifecycleException {
+ delegate.start();
+ }
+
+ @Override
+ public void stop() throws LifecycleException {
+ classLoader = delegate.getClassLoader();
+ delegate.stop();
+ }
+
+ @Override
+ public void destroy() throws LifecycleException {
+ delegate.destroy();
+ }
+
+ @Override
+ public LifecycleState getState() {
+ return delegate.getState();
+ }
+
+ @Override
+ public String getStateName() {
+ return delegate.getStateName();
+ }
+
+ @Override
+ public void backgroundProcess() {
+ delegate.backgroundProcess();
+ }
+
+ @Override
+ public ClassLoader getClassLoader() {
+ return delegate.getClassLoader();
+ }
+
+ @Override
+ public Container getContainer() {
+ return delegate.getContainer();
+ }
+
+ @Override
+ public void setContainer(Container container) {
+ delegate.setContainer(container);
+ }
+
+ @Override
+ public boolean getDelegate() {
+ return delegate.getDelegate();
+ }
+
+ @Override
+ public void setDelegate(boolean delegate) {
+ this.delegate.setDelegate(delegate);
+ }
+
+ @Override
+ public String getInfo() {
+ return delegate.getInfo();
+ }
+
+ @Override
+ public boolean getReloadable() {
+ return delegate.getReloadable();
+ }
+
+ @Override
+ public void setReloadable(boolean reloadable) {
+ delegate.setReloadable(reloadable);
+ }
+
+ @Override
+ public void addPropertyChangeListener(PropertyChangeListener listener) {
+ delegate.addPropertyChangeListener(listener);
+ }
+
+ @Override
+ public void addRepository(String repository) {
+ delegate.addRepository(repository);
+ }
+
+ @Override
+ public String[] findRepositories() {
+ return delegate.findRepositories();
+ }
+
+ @Override
+ public boolean modified() {
+ return delegate.modified();
+ }
+
+ @Override
+ public void removePropertyChangeListener(PropertyChangeListener listener) {
+ delegate.removePropertyChangeListener(listener);
+ }
+
+ public ClassLoader getStopClassLoader() {
+ return classLoader;
+ }
+}
Added:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java?rev=1345767&view=auto
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
(added)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/LazyStopWebappClassLoader.java
Sun Jun 3 20:23:44 2012
@@ -0,0 +1,23 @@
+package org.apache.tomee.catalina;
+
+import org.apache.catalina.LifecycleException;
+import org.apache.catalina.loader.WebappClassLoader;
+
+public class LazyStopWebappClassLoader extends WebappClassLoader {
+ public LazyStopWebappClassLoader() {
+ // no-op
+ }
+
+ public LazyStopWebappClassLoader(final ClassLoader parent) {
+ super(parent);
+ }
+
+ @Override
+ public void stop() throws LifecycleException {
+ // no-op: in our destroyapplication method we need a valid classloader
to TomcatWebAppBuilder.afterStop()
+ }
+
+ public void internalStop() throws LifecycleException {
+ super.stop();
+ }
+}
Modified:
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java?rev=1345767&r1=1345766&r2=1345767&view=diff
==============================================================================
---
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
(original)
+++
openejb/trunk/openejb/tomee/tomee-catalina/src/main/java/org/apache/tomee/catalina/TomcatWebAppBuilder.java
Sun Jun 3 20:23:44 2012
@@ -22,7 +22,9 @@ import java.util.List;
import org.apache.catalina.Container;
import org.apache.catalina.Engine;
import org.apache.catalina.Host;
+import org.apache.catalina.LifecycleException;
import org.apache.catalina.LifecycleListener;
+import org.apache.catalina.Loader;
import org.apache.catalina.Manager;
import org.apache.catalina.Pipeline;
import org.apache.catalina.Realm;
@@ -42,6 +44,7 @@ import org.apache.catalina.deploy.Contex
import org.apache.catalina.deploy.ContextTransaction;
import org.apache.catalina.deploy.NamingResources;
import org.apache.catalina.loader.WebappClassLoader;
+import org.apache.catalina.loader.WebappLoader;
import org.apache.catalina.startup.Constants;
import org.apache.catalina.startup.ContextConfig;
import org.apache.catalina.startup.HostConfig;
@@ -52,7 +55,6 @@ import org.apache.openejb.AppContext;
import org.apache.openejb.BeanContext;
import org.apache.openejb.Injection;
import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.UndeployException;
import org.apache.openejb.assembler.classic.*;
import org.apache.openejb.cdi.CdiBuilder;
import org.apache.openejb.config.AppModule;
@@ -599,6 +601,14 @@ public class TomcatWebAppBuilder impleme
sc.setSessionTrackingModes(newModes);
}
}
+
+ // we just want to wrap it to lazy stop it (afterstop)
+ // to avoid classnotfound in @PreDestoy or destroyApplication()
+ final WebappLoader loader = new
WebappLoader(standardContext.getParentClassLoader());
+ loader.setDelegate(standardContext.getDelegate());
+ loader.setLoaderClass(LazyStopWebappClassLoader.class.getName());
+ final Loader lazyStopLoader = new LazyStopLoader(loader);
+ standardContext.setLoader(lazyStopLoader);
}
@Override
@@ -1052,14 +1062,7 @@ public class TomcatWebAppBuilder impleme
*/
@Override
public void beforeStop(final StandardContext standardContext) {
- final ContextInfo contextInfo = getContextInfo(standardContext);
- if (isUnDeployable(contextInfo)) {
- try {
- assembler.preDestroyApplication(contextInfo.appInfo, null);
- } catch (UndeployException e) {
- logger.error("can't pre deploy the app " +
standardContext.getName(), e);
- }
- }
+ //no-op
}
private boolean isUnDeployable(final ContextInfo contextInfo) {
@@ -1080,7 +1083,9 @@ public class TomcatWebAppBuilder impleme
*/
@Override
public void afterStop(final StandardContext standardContext) {
- if (isIgnored(standardContext)) return;
+ if (isIgnored(standardContext)) {
+ return;
+ }
final ContextInfo contextInfo = getContextInfo(standardContext);
if (isUnDeployable(contextInfo)) {
@@ -1090,6 +1095,18 @@ public class TomcatWebAppBuilder impleme
logger.error("Unable to stop web application " +
standardContext.getPath() + ": Exception: " + e.getMessage(), e);
}
}
+
+ final Loader loader = standardContext.getLoader();
+ if (loader != null && loader instanceof LazyStopLoader) {
+ final ClassLoader old = ((LazyStopLoader)
loader).getStopClassLoader();
+ if (old != null && old instanceof LazyStopWebappClassLoader) {
+ try {
+ ((LazyStopWebappClassLoader) old).internalStop();
+ } catch (LifecycleException e) {
+ logger.error("error stopping classloader of webapp " +
standardContext.getName(), e);
+ }
+ }
+ }
removeContextInfo(standardContext);
}