Author: remm
Date: Mon Sep 25 05:53:14 2006
New Revision: 449669
URL: http://svn.apache.org/viewvc?view=rev&rev=449669
Log:
- 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).
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/CometConnectionManagerValve.java
Modified:
tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/CometConnectionManagerValve.java
URL:
http://svn.apache.org/viewvc/tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/CometConnectionManagerValve.java?view=diff&rev=449669&r1=449668&r2=449669
==============================================================================
---
tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/CometConnectionManagerValve.java
(original)
+++
tomcat/tc6.0.x/trunk/java/org/apache/catalina/valves/CometConnectionManagerValve.java
Mon Sep 25 05:53:14 2006
@@ -28,7 +28,9 @@
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 @@
* <p>Implementation of a Valve that tracks Comet connections, and closes them
* when the associated session expires or the webapp is reloaded.</p>
*
- * <p>This Valve may be attached to any Container, depending on the granularity
- * of the concurrency control you wish to perform.</p>
+ * <p>This Valve should be attached to a Context.</p>
*
* @author Remy Maucherat
* @version $Revision: 386404 $ $Date: 2006-03-16 18:50:37 +0100 (jeu., 16
mars 2006) $
@@ -51,7 +52,7 @@
public class CometConnectionManagerValve
extends ValveBase
- implements Lifecycle, HttpSessionListener {
+ implements Lifecycle, HttpSessionListener, LifecycleListener {
// ----------------------------------------------------- Instance Variables
@@ -148,6 +149,10 @@
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
+ if (container instanceof Context) {
+ ((Lifecycle) container).addLifecycleListener(this);
+ }
+
}
@@ -168,9 +173,16 @@
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<ConnectionInfo[]> iterator = connections.values().iterator();
while (iterator.hasNext()) {
ConnectionInfo[] connectionInfos = iterator.next();
@@ -178,9 +190,6 @@
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 @@
}
}
}
+ 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<ConnectionInfo[]> 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
@@ -328,5 +365,6 @@
public Request request;
public Response response;
}
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]