[jboss-cvs] JBossRemoting/src/main/org/jboss/remoting ...
Ron Sigal
ron_sigal at yahoo.com
Sat Feb 24 18:14:27 EST 2007
User: rsigal
Date: 07/02/24 18:14:27
Modified: src/main/org/jboss/remoting Tag: remoting_2_x Client.java
Log:
JBREM-598, JBREM-657: The bodies of disconnect() and removeListener() now run in a separate thread.
Revision Changes Path
No revision
No revision
1.53.2.25 +118 -89 JBossRemoting/src/main/org/jboss/remoting/Client.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: Client.java
===================================================================
RCS file: /cvsroot/jboss/JBossRemoting/src/main/org/jboss/remoting/Client.java,v
retrieving revision 1.53.2.24
retrieving revision 1.53.2.25
diff -u -b -r1.53.2.24 -r1.53.2.25
--- Client.java 24 Feb 2007 09:20:02 -0000 1.53.2.24
+++ Client.java 24 Feb 2007 23:14:27 -0000 1.53.2.25
@@ -64,7 +64,7 @@
* @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
* @author <a href="mailto:ovidiu at jboss.org">Ovidiu Feodorov</a>
*
- * @version $Revision: 1.53.2.24 $
+ * @version $Revision: 1.53.2.25 $
*/
public class Client implements Externalizable
{
@@ -451,6 +451,10 @@
*/
public void disconnect()
{
+ Thread t = new Thread()
+ {
+ public void run()
+ {
if (invoker != null)
{
// this is a noop if no lease is active
@@ -471,6 +475,11 @@
connected = false;
}
+ };
+
+ t.setName("terminateLease");
+ t.start();
+ }
/**
* Get the client invoker (transport implementation).
@@ -960,84 +969,30 @@
* Removes callback handler as a callback listener from the server (and client in the case that
* it was setup to receive async callbacks). See addListener().
*/
- public void removeListener(InvokerCallbackHandler callbackHandler) throws Throwable
+ public void removeListener(final InvokerCallbackHandler callbackHandler) throws Throwable
{
if (isConnected())
{
if (callbackHandler != null)
{
- // first need to see if is push or pull callback (i.e. does have locator associated
- // with it)
- String listenerId = (String)listeners.get(callbackHandler);
- if(listenerId != null)
- {
- // have a pull callback handler
- Map metadata = new HashMap();
- metadata.put(LISTENER_ID_KEY, listenerId);
- invoke(new InternalInvocation(InternalInvocation.REMOVELISTENER, null), metadata);
-
- // clean up callback poller if one exists
- CallbackPoller callbackPoller = (CallbackPoller) callbackPollers.remove(callbackHandler);
- if (callbackPoller != null)
- {
- callbackPoller.stop();
- }
-
- listeners.remove(callbackHandler);
- }
- else
- {
- // have a push callback handler
- List holderList = invoker.getClientLocators(sessionId, callbackHandler);
- if(holderList != null && holderList.size() > 0)
+ Thread thread = new Thread()
{
- for(int x = 0; x < holderList.size(); x++)
+ public void run()
{
- AbstractInvoker.CallbackLocatorHolder holder =
- (AbstractInvoker.CallbackLocatorHolder)holderList.get(x);
- listenerId = holder.getListenerId();
- InvokerLocator locator = holder.getLocator();
- Map metadata = new HashMap();
- metadata.put(LISTENER_ID_KEY, listenerId);
-
- if (disconnectTimeout >= 0)
- metadata.put(ServerInvoker.TIMEOUT, Integer.toString(disconnectTimeout));
-
try
{
- // now call target server to remove listener
- InternalInvocation ii =
- new InternalInvocation(InternalInvocation.REMOVELISTENER, null);
-
- invoke(ii, metadata);
+ removeListenerInternal(callbackHandler);
}
- catch (Exception e)
+ catch (Throwable throwable)
{
- log.warn("unable to remove remote callback handler: " + e.getMessage());
- }
-
- // call to callback server to remove listener
- Client client = new Client(locator, subsystem);
- client.setSessionId(getSessionId());
- client.connect();
- InternalInvocation ii =
- new InternalInvocation(InternalInvocation.REMOVECLIENTLISTENER,
- new Object[]{callbackHandler});
- client.invoke(ii, metadata);
- client.disconnect();
+ log.error("Unable to remove callback handler", throwable);
}
}
- }
-
- // clean up callback server connector if one exists
- Connector callbackConnector = (Connector) callbackConnectors.remove(callbackHandler);
+ };
- if (callbackConnector != null)
- {
- callbackConnector.stop();
- callbackConnector.destroy();
- }
+ thread.setName("removeListener");
+ thread.start();
}
else
{
@@ -1588,6 +1543,80 @@
return listenerId;
}
+ private void removeListenerInternal(final InvokerCallbackHandler callbackHandler) throws Throwable
+ {
+ // first need to see if is push or pull callback (i.e. does have locator associated
+ // with it)
+ String listenerId = (String)listeners.get(callbackHandler);
+ if(listenerId != null)
+ {
+ // have a pull callback handler
+ Map metadata = new HashMap();
+ metadata.put(LISTENER_ID_KEY, listenerId);
+ invoke(new InternalInvocation(InternalInvocation.REMOVELISTENER, null), metadata);
+
+ // clean up callback poller if one exists
+ CallbackPoller callbackPoller = (CallbackPoller) callbackPollers.remove(callbackHandler);
+ if (callbackPoller != null)
+ {
+ callbackPoller.stop();
+ }
+
+ listeners.remove(callbackHandler);
+ }
+ else
+ {
+ // have a push callback handler
+ List holderList = invoker.getClientLocators(sessionId, callbackHandler);
+ if(holderList != null && holderList.size() > 0)
+ {
+ for(int x = 0; x < holderList.size(); x++)
+ {
+ AbstractInvoker.CallbackLocatorHolder holder =
+ (AbstractInvoker.CallbackLocatorHolder)holderList.get(x);
+ listenerId = holder.getListenerId();
+ InvokerLocator locator = holder.getLocator();
+ Map metadata = new HashMap();
+ metadata.put(LISTENER_ID_KEY, listenerId);
+
+ if (disconnectTimeout >= 0)
+ metadata.put(ServerInvoker.TIMEOUT, Integer.toString(disconnectTimeout));
+
+ try
+ {
+ // now call target server to remove listener
+ InternalInvocation ii =
+ new InternalInvocation(InternalInvocation.REMOVELISTENER, null);
+
+ invoke(ii, metadata);
+ }
+ catch (Exception e)
+ {
+ log.warn("unable to remove remote callback handler: " + e.getMessage());
+ }
+
+ // call to callback server to remove listener
+ Client client = new Client(locator, subsystem);
+ client.setSessionId(getSessionId());
+ client.connect();
+ InternalInvocation ii =
+ new InternalInvocation(InternalInvocation.REMOVECLIENTLISTENER,
+ new Object[]{callbackHandler});
+
+ client.invoke(ii, metadata);
+ client.disconnect();
+ }
+ }
+ }
+
+ // clean up callback server connector if one exists
+ Connector callbackConnector = (Connector) callbackConnectors.remove(callbackHandler);
+ if (callbackConnector != null)
+ {
+ callbackConnector.stop();
+ callbackConnector.destroy();
+ }
+ }
// Inner classes --------------------------------------------------------------------------------
}
More information about the jboss-cvs-commits
mailing list