Author: ron.sigal(a)jboss.com
Date: 2009-07-28 16:35:27 -0400 (Tue, 28 Jul 2009)
New Revision: 5310
Modified:
remoting2/branches/2.2/src/main/org/jboss/remoting/Client.java
Log:
JBREM-1139: Adjusts PortUtil range in constructor; JBREM-1143: implements "invoker
destruction delay" feature.
Modified: remoting2/branches/2.2/src/main/org/jboss/remoting/Client.java
===================================================================
--- remoting2/branches/2.2/src/main/org/jboss/remoting/Client.java 2009-07-28 02:19:48 UTC
(rev 5309)
+++ remoting2/branches/2.2/src/main/org/jboss/remoting/Client.java 2009-07-28 20:35:27 UTC
(rev 5310)
@@ -60,6 +60,8 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
/**
* Client is a convience class for invoking remote methods for a given subsystem. It is
intended to
@@ -152,6 +154,11 @@
*/
public static final int DEFAULT_DISCONNECT_TIMEOUT = -1;
+ /**
+ * Key for setting delay before client invoker is destroyed by disconnect().
+ */
+ public static final String INVOKER_DESTRUCTION_DELAY =
"invokerDestructionDelay";
+
public static final String THROW_CALLBACK_EXCEPTION =
"throwCallbackException";
/** The key to use to specify that parameters for objects created by Client should be
taken,
@@ -169,6 +176,9 @@
private static boolean trace = log.isTraceEnabled();
private static final long serialVersionUID = 5679279425009837934L;
+
+ private static Timer invokerDestructionTimer;
+ private static Object invokerDestructionTimerLock = new Object();
// Static
---------------------------------------------------------------------------------------
@@ -202,6 +212,8 @@
private boolean connected = false;
+ private int invokerDestructionDelay = 0;
+
private Set connectionListeners = new HashSet();
private boolean useClientConnectionIdentity;
@@ -282,9 +294,27 @@
if (configuration != null)
{
this.configuration = new HashMap(configuration);
- Object o = configuration.get(Remoting.USE_CLIENT_CONNECTION_IDENTITY);
+ Object o = configuration.get(INVOKER_DESTRUCTION_DELAY);
if (o instanceof String)
{
+ try
+ {
+ invokerDestructionDelay = Integer.parseInt((String) o);
+ log.debug(this + " setting invokerDestructionDelay to " +
invokerDestructionDelay);
+ }
+ catch (NumberFormatException e)
+ {
+ log.error("invokerDestructionDelay parameter has invalid format:
" + o);
+ }
+ }
+ else if (o != null)
+ {
+ log.error("invokerDestructionDelay parameter must be a string in integer
format: " + o);
+ }
+
+ o = configuration.get(Remoting.USE_CLIENT_CONNECTION_IDENTITY);
+ if (o instanceof String)
+ {
useClientConnectionIdentity = Boolean.valueOf((String) o).booleanValue();
}
else if (o != null)
@@ -304,6 +334,15 @@
}
}
}
+
+ Map tempMap = new HashMap();
+ if (this.configuration != null)
+ {
+ tempMap.putAll(this.configuration);
+ }
+ tempMap.putAll(locator.getParameters());
+ PortUtil.updateRange(tempMap);
+
this.sessionId = new GUID().toString();
}
@@ -634,7 +673,36 @@
// Need to remove myself from registry so will not keep reference to me since I
am of no
// use now. Will have to create a new one.
- InvokerRegistry.destroyClientInvoker(invoker.getLocator(), configuration);
+
+ if (invokerDestructionDelay > 0)
+ {
+ synchronized (invokerDestructionTimerLock)
+ {
+ InvokerDestructionTimerTask task = new
InvokerDestructionTimerTask(invoker);
+ if (invokerDestructionTimer == null)
+ {
+ invokerDestructionTimer = new Timer(true);
+ }
+
+ try
+ {
+ invokerDestructionTimer.schedule(task, invokerDestructionDelay);
+ }
+ catch (IllegalStateException e)
+ {
+ log.debug("Unable to schedule InvokerDestructionTimerTask on
existing Timer", e);
+ invokerDestructionTimer = new Timer(true);
+ invokerDestructionTimer.schedule(task, invokerDestructionDelay);
+ }
+
+ if (trace) log.trace(this + " scheduled destruction of " +
invoker);
+ }
+ }
+ else
+ {
+ InvokerRegistry.destroyClientInvoker(invoker.getLocator(), configuration);
+ }
+
invoker = null;
}
@@ -1944,6 +2012,25 @@
// Inner classes
--------------------------------------------------------------------------------
+
+ class InvokerDestructionTimerTask extends TimerTask
+ {
+ private WeakReference ref;
+
+ public InvokerDestructionTimerTask(ClientInvoker invoker)
+ {
+ ref = new WeakReference(invoker);
+ }
+
+ public void run()
+ {
+ ClientInvoker invoker = (ClientInvoker) ref.get();
+ log.trace(this + " calling InvokerRegistry.destroyClientInvoker() for
" + invoker);
+ InvokerRegistry.destroyClientInvoker(invoker.getLocator(), configuration);
+ ref.clear();
+ ref = null;
+ }
+ }
static class ConnectionValidatorKey
{
Show replies by date