[jboss-remoting-commits] JBoss Remoting SVN: r3884 - in remoting3/trunk: api/src/main/java/org/jboss/cx/remoting/spi/wrapper and 1 other directories.
jboss-remoting-commits at lists.jboss.org
jboss-remoting-commits at lists.jboss.org
Thu Apr 3 16:19:31 EDT 2008
Author: david.lloyd at jboss.com
Date: 2008-04-03 16:19:31 -0400 (Thu, 03 Apr 2008)
New Revision: 3884
Added:
remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java
Modified:
remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java
remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java
remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java
remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java
Log:
JBREM-921 - notify listeners when a session is created or torn down
Modified: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java 2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/Endpoint.java 2008-04-03 20:19:31 UTC (rev 3884)
@@ -92,4 +92,18 @@
* @return the context source
*/
<I, O> ContextSource<I, O> createService(RequestListener<I, O> requestListener);
+
+ /**
+ * Add a listener that is notified when a session is created.
+ *
+ * @param sessionListener the session listener
+ */
+ void addSessionListener(SessionListener sessionListener);
+
+ /**
+ * Remove a previously added session listener.
+ *
+ * @param sessionListener the session listener
+ */
+ void removeSessionListener(SessionListener sessionListener);
}
Added: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java (rev 0)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/SessionListener.java 2008-04-03 20:19:31 UTC (rev 3884)
@@ -0,0 +1,10 @@
+package org.jboss.cx.remoting;
+
+/**
+ *
+ */
+public interface SessionListener {
+ void handleSessionOpened(Session session);
+
+ void handleSessionClosed(Session session);
+}
Modified: remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java
===================================================================
--- remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java 2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/api/src/main/java/org/jboss/cx/remoting/spi/wrapper/EndpointWrapper.java 2008-04-03 20:19:31 UTC (rev 3884)
@@ -9,6 +9,7 @@
import org.jboss.cx.remoting.RemotingException;
import org.jboss.cx.remoting.RequestListener;
import org.jboss.cx.remoting.Session;
+import org.jboss.cx.remoting.SessionListener;
import org.jboss.cx.remoting.spi.Registration;
import org.jboss.cx.remoting.spi.protocol.ProtocolContext;
import org.jboss.cx.remoting.spi.protocol.ProtocolHandler;
@@ -53,6 +54,14 @@
return delegate.createService(requestListener);
}
+ public void addSessionListener(final SessionListener sessionListener) {
+ delegate.addSessionListener(sessionListener);
+ }
+
+ public void removeSessionListener(final SessionListener sessionListener) {
+ delegate.removeSessionListener(sessionListener);
+ }
+
public void close() throws RemotingException {
delegate.close();
}
Modified: remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java
===================================================================
--- remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java 2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreEndpoint.java 2008-04-03 20:19:31 UTC (rev 3884)
@@ -3,6 +3,7 @@
import java.io.IOException;
import java.net.URI;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ConcurrentMap;
@@ -16,6 +17,7 @@
import org.jboss.cx.remoting.RemotingException;
import org.jboss.cx.remoting.RequestListener;
import org.jboss.cx.remoting.Session;
+import org.jboss.cx.remoting.SessionListener;
import org.jboss.cx.remoting.core.util.OrderedExecutorFactory;
import org.jboss.cx.remoting.log.Logger;
import org.jboss.cx.remoting.spi.Registration;
@@ -42,6 +44,7 @@
private final RequestListener<?, ?> rootListener;
private final Endpoint userEndpoint = new UserEndpoint();
private final AtomicStateMachine<State> state = AtomicStateMachine.start(State.INITIAL);
+ private final Set<SessionListener> sessionListeners = CollectionUtil.synchronizedSet(new LinkedHashSet<SessionListener>());
private OrderedExecutorFactory orderedExecutorFactory;
private Executor executor;
@@ -93,8 +96,20 @@
}
void removeSession(CoreSession coreSession) {
- sessions.remove(coreSession);
- sessions.notifyAll();
+ synchronized (sessions) {
+ if (!sessions.remove(coreSession)) {
+ return;
+ }
+ sessions.notifyAll();
+ }
+ final Session userSession = coreSession.getUserSession();
+ for (final SessionListener listener : sessionListeners) {
+ executor.execute(new Runnable() {
+ public void run() {
+ listener.handleSessionClosed(userSession);
+ }
+ });
+ }
}
public void start() {
@@ -188,7 +203,15 @@
final CoreSession session = new CoreSession(CoreEndpoint.this);
session.initializeClient(factory, uri, attributeMap, createContext(rootListener));
sessions.add(session);
- return session.getUserSession();
+ final Session userSession = session.getUserSession();
+ for (final SessionListener listener : sessionListeners) {
+ executor.execute(new Runnable() {
+ public void run() {
+ listener.handleSessionOpened(userSession);
+ }
+ });
+ }
+ return userSession;
} catch (IOException e) {
RemotingException rex = new RemotingException("Failed to create protocol handler: " + e.getMessage());
rex.setStackTrace(e.getStackTrace());
@@ -248,6 +271,16 @@
return outbound.getUserContextSource();
}
+ public void addSessionListener(final SessionListener sessionListener) {
+ // TODO security check
+ sessionListeners.add(sessionListener);
+ }
+
+ public void removeSessionListener(final SessionListener sessionListener) {
+ // TODO security check
+ sessionListeners.remove(sessionListener);
+ }
+
public void close() throws RemotingException {
if (state.transitionHold(State.UP, State.DOWN)) try {
Iterator<CloseHandler<Endpoint>> it = closeHandlers.iterator();
Modified: remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java
===================================================================
--- remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java 2008-04-03 20:03:49 UTC (rev 3883)
+++ remoting3/trunk/core/src/main/java/org/jboss/cx/remoting/core/CoreSession.java 2008-04-03 20:19:31 UTC (rev 3884)
@@ -248,6 +248,8 @@
protocolHandler.closeSession();
} catch (IOException e) {
log.trace(e, "Protocol handler session close failed");
+ } finally {
+ endpoint.removeSession(this);
}
}
}
More information about the jboss-remoting-commits
mailing list