[jboss-cvs] JBossRemoting/src/main/org/jboss/remoting ...
Timothy Fox
tim.fox at jboss.com
Wed Jan 31 08:37:04 EST 2007
User: timfox
Date: 07/01/31 08:37:04
Modified: src/main/org/jboss/remoting Tag: remoting_2_x
ServerInvoker.java
Log:
Optimisation when making callbacks
Revision Changes Path
No revision
No revision
1.52.2.26 +83 -32 JBossRemoting/src/main/org/jboss/remoting/ServerInvoker.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ServerInvoker.java
===================================================================
RCS file: /cvsroot/jboss/JBossRemoting/src/main/org/jboss/remoting/ServerInvoker.java,v
retrieving revision 1.52.2.25
retrieving revision 1.52.2.26
diff -u -b -r1.52.2.25 -r1.52.2.26
--- ServerInvoker.java 31 Jan 2007 11:10:22 -0000 1.52.2.25
+++ ServerInvoker.java 31 Jan 2007 13:37:04 -0000 1.52.2.26
@@ -65,7 +65,7 @@
* @author <a href="mailto:tom.elrod at jboss.com">Tom Elrod</a>
* @author <a href="mailto:ovidiu at jboss.org">Ovidiu Feodorov</a>
*
- * @version $Revision: 1.52.2.25 $
+ * @version $Revision: 1.52.2.26 $
*/
public abstract class ServerInvoker extends AbstractInvoker implements ServerInvokerMBean
{
@@ -198,9 +198,13 @@
protected Map handlers = new HashMap();
- //If there is only one handler we store a direct reference to it, as an optimisation
- //to avoid lookup in this common case - TLF
- protected ServerInvocationHandler singleHandler;
+ // If there is only one handler we store a direct reference to it, as an optimisation
+ // to avoid lookup in this common case - TLF
+ protected volatile ServerInvocationHandler singleHandler;
+
+ // If there is only one callback container we store a direct reference to it, as an optimisation
+ // to avoid lookup in this common case - TLF
+ protected volatile CallbackContainer singleCallbackContainer;
protected Map callbackHandlers = new HashMap();
protected Map clientCallbackListener = new HashMap();
@@ -658,6 +662,8 @@
{
// no point in delaying return to client if oneway
handleOnewayInvocation((OnewayInvocation)param, invocation);
+
+ return null;
}
else
{
@@ -1234,7 +1240,57 @@
if(trace) { log.trace("handling InternalInvocation where method name = " + methodName); }
// check if the invocation is for callback handling
- if(InternalInvocation.ADDLISTENER.equals(methodName))
+ if(InternalInvocation.HANDLECALLBACK.equals(methodName))
+ {
+ String sessionId = ServerInvokerCallbackHandler.getId(invocation);
+ if(trace) { log.trace("ServerInvoker (" + this + ") is being asked to deliver callback on client callback handler with session id of " + sessionId + "."); }
+
+ CallbackContainer callbackContainer = null;
+
+ if (singleCallbackContainer != null)
+ {
+ callbackContainer = singleCallbackContainer;
+ }
+ else
+ {
+ callbackContainer = (CallbackContainer)clientCallbackListener.get(sessionId);
+ }
+
+ if(callbackContainer != null && callbackContainer.getCallbackHandler() != null)
+ {
+ Object[] params = param.getParameters();
+
+ Callback callbackRequest = (Callback) params[0];
+
+ Object obj = callbackContainer.getCallbackHandleObject();
+
+ if (obj != null)
+ {
+ Map callbackHandleObject = callbackRequest.getReturnPayload();
+
+ if(callbackHandleObject == null)
+ {
+ callbackHandleObject = new HashMap();
+ }
+
+ //We only want to add it if it is not null otherwise is a redundant operation
+ callbackHandleObject.put(Callback.CALLBACK_HANDLE_OBJECT_KEY,
+ obj);
+
+ callbackRequest.setReturnPayload(callbackHandleObject);
+ }
+
+ InvokerCallbackHandler callbackHandler = callbackContainer.getCallbackHandler();
+
+ callbackHandler.handleCallback(callbackRequest);
+ }
+ else
+ {
+ log.error("Could not find callback handler to call upon for handleCallback " +
+ "where session id equals " + sessionId);
+ }
+ }
+ else if(InternalInvocation.ADDLISTENER.equals(methodName))
{
if(handler == null)
{
@@ -1304,8 +1360,20 @@
Object callbackHandleObject = params[1];
CallbackContainer callbackContainer =
new CallbackContainer(callbackHandler, callbackHandleObject);
+
clientCallbackListener.put(sessionId, callbackContainer);
+ //If there is only one CallbackContainer we store a direct reference to it to avoid
+ //unnecessary lookups - TLF
+ if (clientCallbackListener.size() == 1)
+ {
+ singleCallbackContainer = callbackContainer;
+ }
+ else
+ {
+ singleCallbackContainer = null;
+ }
+
log.debug("ServerInvoker (" + this + ") added client callback handler " + callbackHandler +
" with session id of " + sessionId + " and callback handle object of " +
callbackHandleObject + ".");
@@ -1325,37 +1393,20 @@
"Can not remove callback listener from callback server with id of " + sessionId +
" as it does not exist as a registered callback listener.");
}
-
- }
- else if(InternalInvocation.HANDLECALLBACK.equals(methodName))
+ //If there is only one CallbackContainer we store a direct reference to it to avoid
+ //unnecessary lookups - TLF
+ if (clientCallbackListener.size() == 1)
{
- String sessionId = ServerInvokerCallbackHandler.getId(invocation);
- if(trace) { log.trace("ServerInvoker (" + this + ") is being asked to deliver callback on client callback handler with session id of " + sessionId + "."); }
-
- CallbackContainer callbackContainer =
- (CallbackContainer) clientCallbackListener.get(sessionId);
-
- if(callbackContainer != null && callbackContainer.getCallbackHandler() != null)
- {
- Object[] params = param.getParameters();
- Callback callbackRequest = (Callback) params[0];
- Map callbackHandleObject = callbackRequest.getReturnPayload();
- if(callbackHandleObject == null)
- {
- callbackHandleObject = new HashMap();
- }
- callbackHandleObject.put(Callback.CALLBACK_HANDLE_OBJECT_KEY,
- callbackContainer.getCallbackHandleObject());
- callbackRequest.setReturnPayload(callbackHandleObject);
- InvokerCallbackHandler callbackHandler = callbackContainer.getCallbackHandler();
- callbackHandler.handleCallback(callbackRequest);
+ singleCallbackContainer =
+ (CallbackContainer)clientCallbackListener.values().iterator().next();
}
else
{
- log.error("Could not find callback handler to call upon for handleCallback " +
- "where session id equals " + sessionId);
+ singleCallbackContainer = null;
}
+
}
+
else if(InternalInvocation.ADDSTREAMCALLBACK.equals(methodName))
{
StreamHandler streamHandler = getStreamHandler(invocation);
More information about the jboss-cvs-commits
mailing list