From: remm Date: Mon, 25 Sep 2006 12:53:14 +0000 (+0000) Subject: - Fix a design issue: when stop is run, the servlet will have been deallocated alread... X-Git-Url: https://git.internetallee.de/?a=commitdiff_plain;h=aafe2cf844873351eed111cb2b36f874922cd315;p=tomcat7.0 - Fix a design issue: when stop is run, the servlet will have been deallocated already (so only basic cleanup may be done at this point). git-svn-id: https://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk@449669 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/java/org/apache/catalina/valves/CometConnectionManagerValve.java b/java/org/apache/catalina/valves/CometConnectionManagerValve.java index 05be5eaf3..971439eec 100644 --- a/java/org/apache/catalina/valves/CometConnectionManagerValve.java +++ b/java/org/apache/catalina/valves/CometConnectionManagerValve.java @@ -28,7 +28,9 @@ import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; import org.apache.catalina.CometEvent; +import org.apache.catalina.Context; import org.apache.catalina.Lifecycle; +import org.apache.catalina.LifecycleEvent; import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleListener; import org.apache.catalina.connector.CometEventImpl; @@ -42,8 +44,7 @@ import org.apache.catalina.util.StringManager; *

Implementation of a Valve that tracks Comet connections, and closes them * when the associated session expires or the webapp is reloaded.

* - *

This Valve may be attached to any Container, depending on the granularity - * of the concurrency control you wish to perform.

+ *

This Valve should be attached to a Context.

* * @author Remy Maucherat * @version $Revision: 386404 $ $Date: 2006-03-16 18:50:37 +0100 (jeu., 16 mars 2006) $ @@ -51,7 +52,7 @@ import org.apache.catalina.util.StringManager; public class CometConnectionManagerValve extends ValveBase - implements Lifecycle, HttpSessionListener { + implements Lifecycle, HttpSessionListener, LifecycleListener { // ----------------------------------------------------- Instance Variables @@ -148,6 +149,10 @@ public class CometConnectionManagerValve lifecycle.fireLifecycleEvent(START_EVENT, null); started = true; + if (container instanceof Context) { + ((Lifecycle) container).addLifecycleListener(this); + } + } @@ -168,9 +173,16 @@ public class CometConnectionManagerValve lifecycle.fireLifecycleEvent(STOP_EVENT, null); started = false; + if (container instanceof Context) { + ((Lifecycle) container).removeLifecycleListener(this); + } + // The webapp is getting stopped, so all current connections // should be closed // Close all Comet connections associated with this session + // Note: this will only be done if the container was not a Context + // (otherwise, this needs to be done before stop, as the servlet would + // be deallocated already) Iterator iterator = connections.values().iterator(); while (iterator.hasNext()) { ConnectionInfo[] connectionInfos = iterator.next(); @@ -178,9 +190,6 @@ public class CometConnectionManagerValve for (int i = 0; i < connectionInfos.length; i++) { ConnectionInfo connectionInfo = connectionInfos[i]; try { - ((CometEventImpl) connectionInfo.event).setEventType(CometEvent.EventType.END); - ((CometEventImpl) connectionInfo.event).setEventSubType(CometEvent.EventSubType.WEBAPP_RELOAD); - getNext().event(connectionInfo.request, connectionInfo.response, connectionInfo.event); connectionInfo.event.close(); } catch (Exception e) { container.getLogger().warn(sm.getString("cometConnectionManagerValve.event"), e); @@ -188,10 +197,38 @@ public class CometConnectionManagerValve } } } + connections.clear(); } + public void lifecycleEvent(LifecycleEvent event) { + if (event.getType() == Lifecycle.BEFORE_STOP_EVENT) { + // The webapp is getting stopped, so all current connections + // should be closed + // Close all Comet connections associated with this session + Iterator iterator = connections.values().iterator(); + while (iterator.hasNext()) { + ConnectionInfo[] connectionInfos = iterator.next(); + if (connectionInfos != null) { + for (int i = 0; i < connectionInfos.length; i++) { + ConnectionInfo connectionInfo = connectionInfos[i]; + try { + ((CometEventImpl) connectionInfo.event).setEventType(CometEvent.EventType.END); + ((CometEventImpl) connectionInfo.event).setEventSubType(CometEvent.EventSubType.WEBAPP_RELOAD); + getNext().event(connectionInfo.request, connectionInfo.response, connectionInfo.event); + connectionInfo.event.close(); + } catch (Exception e) { + container.getLogger().warn(sm.getString("cometConnectionManagerValve.event"), e); + } + } + } + } + connections.clear(); + } + } + + // --------------------------------------------------------- Public Methods @@ -329,4 +366,5 @@ public class CometConnectionManagerValve public Response response; } + }