[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