[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