You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by gd...@apache.org on 2007/01/21 06:07:30 UTC
svn commit: r498245 - in /geronimo/server/trunk/modules:
geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/
geronimo-clustering/src/main/java/org/apache/geronimo/clustering/
geronimo-jetty6-clustering-wadi/src/main/java/org/apa...
Author: gdamour
Date: Sat Jan 20 21:07:29 2007
New Revision: 498245
URL: http://svn.apache.org/viewvc?view=rev&rev=498245
Log:
* Add SessionListener.notifySessionDestruction: clients can now receive
callbacks when a Session is destroyed, e.g. when they expire.
* ClusteredSessionManager uses this callback to properly remove the
destroyed session from its internal storage.
* Sync code with the new WADI API.
This fixes GERONIMO-2764 - Clustered HttpSessions are not properly destroyed
during eviction.
Modified:
geronimo/server/trunk/modules/geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/BasicWADISessionManager.java
geronimo/server/trunk/modules/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/SessionListener.java
geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandler.java
geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java
geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java
Modified: geronimo/server/trunk/modules/geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/BasicWADISessionManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/BasicWADISessionManager.java?view=diff&rev=498245&r1=498244&r2=498245
==============================================================================
--- geronimo/server/trunk/modules/geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/BasicWADISessionManager.java (original)
+++ geronimo/server/trunk/modules/geronimo-clustering-wadi/src/main/java/org/apache/geronimo/clustering/wadi/BasicWADISessionManager.java Sat Jan 20 21:07:29 2007
@@ -37,7 +37,7 @@
import org.codehaus.wadi.InvocationException;
import org.codehaus.wadi.Motable;
import org.codehaus.wadi.PoolableInvocationWrapperPool;
-import org.codehaus.wadi.SessionPool;
+import org.codehaus.wadi.SessionMonitor;
import org.codehaus.wadi.core.ConcurrentMotableMap;
import org.codehaus.wadi.group.Dispatcher;
import org.codehaus.wadi.impl.ClusteredManager;
@@ -49,6 +49,7 @@
import org.codehaus.wadi.servicespace.ServiceSpace;
import org.codehaus.wadi.servicespace.ServiceSpaceName;
import org.codehaus.wadi.web.WebSession;
+import org.codehaus.wadi.web.WebSessionFactory;
import edu.emory.mathcs.backport.java.util.concurrent.CopyOnWriteArrayList;
@@ -67,6 +68,7 @@
private final CopyOnWriteArrayList listeners;
private ClusteredManager manager;
+ private SessionMonitor sessionMonitor;
private ServiceSpace serviceSpace;
public BasicWADISessionManager(WADISessionManagerConfigInfo configInfo,
@@ -100,7 +102,7 @@
ConcurrentMotableMap mmap,
Evicter mevicter,
PoolableInvocationWrapperPool requestPool) {
- return new MotionTracker(next, mevicter, mmap, contextPool, requestPool);
+ return new MotionTracker(next, mevicter, mmap, sessionFactory, requestPool);
}
};
stackContext.build();
@@ -108,6 +110,9 @@
serviceSpace = stackContext.getServiceSpace();
manager = stackContext.getManager();
+ sessionMonitor = stackContext.getSessionMonitor();
+ sessionMonitor.addSessionListener(new SessionListenerAdapter());
+
serviceSpace.start();
}
@@ -164,6 +169,14 @@
return webSession;
}
+ private WebSession notifySessionDestruction(WebSession webSession) {
+ for (Iterator iter = listeners.iterator(); iter.hasNext();) {
+ SessionListener listener = (SessionListener) iter.next();
+ listener.notifySessionDestruction(new WADISessionAdaptor(webSession));
+ }
+ return webSession;
+ }
+
private class MotionTracker extends MemoryContextualiser {
private final Immoter immoter;
private final Emoter emoter;
@@ -171,9 +184,9 @@
public MotionTracker(Contextualiser next,
Evicter evicter,
ConcurrentMotableMap map,
- SessionPool pool,
+ WebSessionFactory sessionFactory,
PoolableInvocationWrapperPool requestPool) {
- super(next, evicter, map, pool, requestPool);
+ super(next, evicter, map, sessionFactory, requestPool);
Immoter immoterDelegate = super.getImmoter();
immoter = new InboundSessionTracker(immoterDelegate);
@@ -237,6 +250,17 @@
public Motable newMotable() {
return delegate.newMotable();
}
+ }
+
+ private class SessionListenerAdapter implements org.codehaus.wadi.SessionListener {
+
+ public void onSessionCreation(org.codehaus.wadi.Session session) {
+ }
+
+ public void onSessionDestruction(org.codehaus.wadi.Session session) {
+ notifySessionDestruction((WebSession) session);
+ }
+
}
public static final GBeanInfo GBEAN_INFO;
Modified: geronimo/server/trunk/modules/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/SessionListener.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/SessionListener.java?view=diff&rev=498245&r1=498244&r2=498245
==============================================================================
--- geronimo/server/trunk/modules/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/SessionListener.java (original)
+++ geronimo/server/trunk/modules/geronimo-clustering/src/main/java/org/apache/geronimo/clustering/SessionListener.java Sat Jan 20 21:07:29 2007
@@ -48,4 +48,10 @@
*/
void notifyOutboundSessionMigration(Session session);
+ /**
+ * Calls when a Session is destroyed.
+ *
+ * @param session Destroyed session.
+ */
+ void notifySessionDestruction(Session session);
}
Modified: geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandler.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandler.java?view=diff&rev=498245&r1=498244&r2=498245
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandler.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandler.java Sat Jan 20 21:07:29 2007
@@ -29,7 +29,6 @@
import org.apache.geronimo.clustering.ClusteredInvocationException;
import org.apache.geronimo.jetty6.cluster.AbstractClusteredPreHandler;
import org.codehaus.wadi.InvocationException;
-import org.codehaus.wadi.InvocationProxy;
import org.codehaus.wadi.impl.ClusteredManager;
import org.codehaus.wadi.web.impl.WebInvocation;
@@ -68,8 +67,7 @@
}
}
};
- InvocationProxy invocationProxy = wadiManager.getInvocationProxy();
- invocation.init(request, response, chainAdapter, invocationProxy);
+ invocation.init(request, response, chainAdapter);
try {
wadiManager.contextualise(invocation);
} catch (InvocationException e) {
Modified: geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java?view=diff&rev=498245&r1=498244&r2=498245
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6-clustering-wadi/src/main/java/org/apache/geronimo/jetty6/cluster/wadi/WADIClusteredPreHandlerFactory.java Sat Jan 20 21:07:29 2007
@@ -36,6 +36,9 @@
private ClusteredManager wadiManager;
public WADIClusteredPreHandlerFactory(WADISessionManager sessionManager) {
+ if (null == sessionManager) {
+ throw new IllegalArgumentException("sessionManager is required");
+ }
this.sessionManager = sessionManager;
}
Modified: geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java?view=diff&rev=498245&r1=498244&r2=498245
==============================================================================
--- geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java (original)
+++ geronimo/server/trunk/modules/geronimo-jetty6/src/main/java/org/apache/geronimo/jetty6/cluster/ClusteredSessionManager.java Sat Jan 20 21:07:29 2007
@@ -47,9 +47,6 @@
setIdManager(sessionIdManager);
sessionManager.registerListener(new MigrationListener());
-
- // sessions are not removed by this manager. They are invalidated via a callback mechanism
- setMaxInactiveInterval(-1);
}
@Override
@@ -111,6 +108,16 @@
}
public void notifyOutboundSessionMigration(org.apache.geronimo.clustering.Session session) {
+ ClusteredSession clusteredSession = getClusteredSession(session);
+ removeSession(clusteredSession, false);
+ }
+
+ public void notifySessionDestruction(org.apache.geronimo.clustering.Session session) {
+ ClusteredSession clusteredSession = getClusteredSession(session);
+ removeSession(clusteredSession, true);
+ }
+
+ private ClusteredSession getClusteredSession(org.apache.geronimo.clustering.Session session) throws AssertionError {
ClusteredSession clusteredSession;
synchronized (idToSession) {
clusteredSession = idToSession.remove(session.getSessionId());
@@ -118,8 +125,10 @@
if (null == clusteredSession) {
throw new AssertionError("Session [" + session + "] is undefined");
}
- removeSession(clusteredSession, false);
+ return clusteredSession;
}
+
+
}
public class ClusteredSession extends Session {