[jboss-cvs] JBossRemoting/src/main/org/jboss/remoting/samples/callback/statistics ...

Ron Sigal ron_sigal at yahoo.com
Thu Nov 16 18:46:44 EST 2006


  User: rsigal  
  Date: 06/11/16 18:46:44

  Added:       src/main/org/jboss/remoting/samples/callback/statistics  
                        CallbackServer.java CallbackClient.java
  Log:
  JBREM-618:  Sample code demonstrating CallbackPoller statistics.
  
  Revision  Changes    Path
  1.1      date: 2006/11/16 23:46:44;  author: rsigal;  state: Exp;JBossRemoting/src/main/org/jboss/remoting/samples/callback/statistics/CallbackServer.java
  
  Index: CallbackServer.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * by the @authors tag. See the copyright.txt in the distribution for a
  * full listing of individual contributors.
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as
  * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
  
  package org.jboss.remoting.samples.callback.statistics;
  
  import java.util.ArrayList;
  import java.util.HashMap;
  import java.util.Iterator;
  import java.util.List;
  import javax.management.MBeanServer;
  import org.jboss.remoting.InvocationRequest;
  import org.jboss.remoting.InvokerLocator;
  import org.jboss.remoting.ServerInvocationHandler;
  import org.jboss.remoting.ServerInvoker;
  import org.jboss.remoting.callback.Callback;
  import org.jboss.remoting.callback.CallbackListener;
  import org.jboss.remoting.callback.HandleCallbackException;
  import org.jboss.remoting.callback.InvokerCallbackHandler;
  import org.jboss.remoting.callback.ServerInvokerCallbackHandler;
  import org.jboss.remoting.transport.Connector;
  
  /**
   * Simple remoting server.  Uses inner class SampleInvocationHandler
   * as the invocation target handler class, which will generate
   * callback messages upon callback listeners being added.
   *
   * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
   */
  public class CallbackServer
  {
     // Default locator values
     private static String transport = "socket";
     private static String host = "localhost";
     private static int port = 5400;
  
     // counter indicating the number of callbacks generated
     private static int callbackCounter = 1;
  
     // remoting server connector
     private Connector connector = null;
  
     // String to be returned from invocation handler upon client invocation calls.
     private static final String RESPONSE_VALUE = "This is the return to SampleInvocationHandler invocation";
  
     /**
      * Sets up target remoting server.
      *
      * @param locatorURI
      * @throws Exception
      */
     public void setupServer(String locatorURI) throws Exception
     {
        InvokerLocator locator = new InvokerLocator(locatorURI);
        System.out.println("Starting remoting server with locator uri of: " + locatorURI);
        connector = new Connector();
        connector.setInvokerLocator(locator.getLocatorURI());
        connector.create();
  
        SampleInvocationHandler invocationHandler = new SampleInvocationHandler();
        connector.addInvocationHandler("sample", invocationHandler);
  
        connector.start();
     }
  
     /**
      * Shuts down the server
      */
     public void shutdownServer()
     {
        connector.stop();
        connector.destroy();
     }
  
     /**
      * Can pass transport and port to be used as parameters.
      */
     public static void main(String[] args)
     {
        if(args != null && args.length == 2)
        {
           transport = args[0];
           port = Integer.parseInt(args[1]);
        }
        String locatorURI = transport + "://" + host + ":" + port;
        CallbackServer server = new CallbackServer();
        try
        {
           server.setupServer(locatorURI);
  
           // wait forever, let the user kill us at any point (at which point, the client will detect we went down)
           while(true)
           {
              Thread.sleep(1000);
           }
  
        }
        catch(Exception e)
        {
           e.printStackTrace();
        }
     }
  
     /**
      * Simple invocation handler implementation.  When callback clients are registered, will
      * generate callbacks periodically.
      */
     public static class SampleInvocationHandler
     implements ServerInvocationHandler, Runnable, CallbackListener
     {
        // list of callback listeners registered
        private List listeners = new ArrayList();
  
        // flag to indicate when should generate callback messages
        private boolean shouldGenerateCallbacks = false;
  
        public SampleInvocationHandler()
        {
           // will start a new thread for generating callbacks.
           Thread callbackThread = new Thread(this);
           callbackThread.setDaemon(true);
           callbackThread.start();
        }
  
        /**
         * Called by the remoting server to handle the invocation from client.
         */
        public Object invoke(InvocationRequest invocation) throws Throwable
        {
           return RESPONSE_VALUE;
        }
  
        /**
         * Adds a callback handler that will listen for callbacks from
         * the server invoker handler.
         */
        public void addListener(InvokerCallbackHandler callbackHandler)
        {
           System.out.println("Adding callback listener.");
           listeners.add(callbackHandler);
           shouldGenerateCallbacks = true;
        }
  
        /**
         * Removes the callback handler that was listening for callbacks
         * from the server invoker handler.
         */
        public void removeListener(InvokerCallbackHandler callbackHandler)
        {
           System.out.println("Removing callback listener.");
           listeners.remove(callbackHandler);
           if(listeners.size() == 0)
           {
              shouldGenerateCallbacks = false;
           }
        }
  
        /**
         * Will generate callback messages every second while shouldGenerateCallbacks
         * flag is true.
         */
        public void run()
        {
           // keep looping while waiting to fire callbacks.
           while(true)
           {
              while(shouldGenerateCallbacks)
              {
                 // create new callback message
                 Callback callback = new Callback("Callback " + callbackCounter + ": This is the payload of callback invocation.");
                 System.out.println("sending callback: " + callbackCounter);
                 
                 // Register as listener, pass callback id, and ask Remoting to handle acknowledgements.
                 HashMap returnPayload = new HashMap();
                 returnPayload.put(ServerInvokerCallbackHandler.CALLBACK_LISTENER, this);
                 returnPayload.put(ServerInvokerCallbackHandler.CALLBACK_ID, new Integer(callbackCounter++));
                 returnPayload.put(ServerInvokerCallbackHandler.REMOTING_ACKNOWLEDGES_PUSH_CALLBACKS, "true");
                 callback.setReturnPayload(returnPayload);
                 
                 Iterator itr = listeners.iterator();
                 while(itr.hasNext())
                 {
                    InvokerCallbackHandler callbackHandler = (InvokerCallbackHandler) itr.next();
                    try
                    {
                       callbackHandler.handleCallback(callback);
                    }
                    catch(HandleCallbackException e)
                    {
                       e.printStackTrace();
                    }
                 }
                 // sleep for a second before firing next callback message
                 try
                 {
                    Thread.sleep(1000);
                 }
                 catch(InterruptedException e)
                 {
                 }
  
              }
              // sleep for a second before while waiting for flag to be set
              try
              {
                 Thread.sleep(1000);
              }
              catch(InterruptedException e)
              {
              }
           }
        }
  
        public void setMBeanServer(MBeanServer server) {}
        public void setInvoker(ServerInvoker invoker) {}
        
        public void acknowledgeCallback(InvokerCallbackHandler callbackHandler, Object callbackId, Object response)
        {
           System.out.println("received acknowledgement for callback: " + callbackId);
        }
  
     }
  }
  
  
  1.1      date: 2006/11/16 23:46:44;  author: rsigal;  state: Exp;JBossRemoting/src/main/org/jboss/remoting/samples/callback/statistics/CallbackClient.java
  
  Index: CallbackClient.java
  ===================================================================
  /*
  * JBoss, Home of Professional Open Source
  * Copyright 2005, JBoss Inc., and individual contributors as indicated
  * by the @authors tag. See the copyright.txt in the distribution for a
  * full listing of individual contributors.
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as
  * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
  
  package org.jboss.remoting.samples.callback.statistics;
  
  import java.util.HashMap;
  
  import org.jboss.remoting.Client;
  import org.jboss.remoting.InvokerLocator;
  import org.jboss.remoting.callback.Callback;
  import org.jboss.remoting.callback.CallbackPoller;
  import org.jboss.remoting.callback.HandleCallbackException;
  import org.jboss.remoting.callback.InvokerCallbackHandler;
  
  /**
   * Sample client that demonstrates CallbackPoller tuning statistics.
   * 
   * @author <a href="mailto:ron.sigal at jboss.com">Ron Sigal</a>
   * @author <a href="mailto:telrod at e2technologies.net">Tom Elrod</a>
   */
  public class CallbackClient
  {
     // Default locator values
     private static String transport = "socket";
     private static String host = "localhost";
     private static int port = 5400;
  
  
     /**
      * Registers callback listener and asks CallbackPoller to print statistics.
      */
     public void getPolledCallbacks(String locatorURI) throws Throwable
     {
        System.out.println("Calling remoting server with locator uri of: " + locatorURI);
        InvokerLocator locator = new InvokerLocator(locatorURI);
        Client client = new Client(locator);
        client.connect();
        
        // Registter callback handler and tell CallbackPoller to report statistics.
        CallbackHandler callbackHandler = new CallbackHandler();
        HashMap metadata = new HashMap();
        metadata.put(CallbackPoller.REPORT_STATISTICS, "true");
        client.addListener(callbackHandler, metadata);
  
        // Wait for callbacks to received, processed, and acknowledged.
        Thread.sleep(20000);
  
        // remove callback handler from server
        client.removeListener(callbackHandler);
        client.disconnect();
     }
  
  
     /**
      * Can pass transport and port to be used as parameters.
      */
     public static void main(String[] args)
     {
        if(args != null && args.length == 2)
        {
           transport = args[0];
           port = Integer.parseInt(args[1]);
        }
        String locatorURI = transport + "://" + host + ":" + port;
        CallbackClient callbackClient = new CallbackClient();
        try
        {
           callbackClient.getPolledCallbacks(locatorURI);
        }
        catch(Throwable e)
        {
           e.printStackTrace();
        }
     }
  
     /**
      * Our implementation of the InvokerCallbackHandler.  Simply
      * prints out the callback object's message upon receiving it.
      */
     public class CallbackHandler implements InvokerCallbackHandler
     {
        public void handleCallback(Callback callback) throws HandleCallbackException
        {
           // Slow down callback handling so callbacks build up in CallbackPoller.
           try
           {
              Thread.sleep(1000);
           }
           catch (InterruptedException e) {}
  
           System.out.println("Received push callback.");
           System.out.println("Received callback value of: " + callback.getCallbackObject());
           System.out.println("Received callback server invoker of: " + callback.getServerLocator());
        }
     }
  
  }
  
  



More information about the jboss-cvs-commits mailing list