You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@avalon.apache.org by bl...@apache.org on 2002/09/30 20:34:44 UTC

cvs commit: jakarta-avalon-excalibur/event/src/xdocs event-howto.xml mpool-howto.xml menu.xml thread-howto.xml thread.xml

bloritsch    2002/09/30 11:34:44

  Modified:    event/src/xdocs menu.xml
  Added:       event/src/xdocs event-howto.xml mpool-howto.xml
  Removed:     event/src/xdocs thread-howto.xml thread.xml
  Log:
  Update the docs with MPool how-to
  
  Revision  Changes    Path
  1.11      +0 -4      jakarta-avalon-excalibur/event/src/xdocs/menu.xml
  
  Index: menu.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/event/src/xdocs/menu.xml,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- menu.xml	27 Sep 2002 20:30:44 -0000	1.10
  +++ menu.xml	30 Sep 2002 18:34:43 -0000	1.11
  @@ -14,7 +14,6 @@
         <item href="event.html" name="Event"/>
         <item href="command.html" name="Command"/>
         <item href="mpool.html" name="MPool"/>
  -      <item href="thread.html" name="Thread"/>
         <item href="util.html" name="Util"/>
       </menu>
   
  @@ -23,10 +22,7 @@
         <item href="event-howto.html" name="Use Event Queues"/>
   -->
         <item href="command-howto.html" name="Use the Command Manager"/>
  -<!--
         <item href="mpool-howto.html" name="Use MPool"/>
  -        -->
  -      <item href="thread-howto.html" name="Use Thread Pools"/>
         <item href="util-howto.html" name="Use System Util"/>
         <item href="cpuparser-howto.html" name="Extend System Util"/>
       </menu>
  
  
  
  1.1                  jakarta-avalon-excalibur/event/src/xdocs/event-howto.xml
  
  Index: event-howto.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
    <header>
      <title>Excalibur Event - Overview</title>
      <authors>
        <person name="Berin Loritsch" email="bloritsch@apache.org"/>
      </authors>
    </header>
    <body>
      <s1 title="Introduction">
        <p>
          This is the Excalibur Event package which includes event queues,
          asynchronous command processing, and the interfaces to support
          event based programming.  Event is heavily influenced by Matt
          Welsh's work with the
          <fork href="http://www.cs.berkeley.edu/~mdw/proj/seda/">SEDA architecture</fork>.
          We forked the portion of his SandStorm server that had to do with
          event processing.  From there we cleaned up the API and made it as
          generic as we could.
        </p>
        <p>
          The Event package actually has five related sub packages inside
          of it.  Event is the basic interfaces for the Queues, Sinks,
          Sources, etc.  Command houses code for the CommandManager so that
          your code can safely process Commands (a type of event) in the
          background.  MPool, short for Managed Pool, houses code for a
          pool implementation that manages its size asynchronously so you
          don't have to worry about it.  Thread is the thread pool code
          which uses MPool to keep track of the threads.  Lastly, Util
          provides some basic utilities so that we can programatically
          determine the number of processors your hardware has.
        </p>
      </s1>
    </body>
    <footer>
      <legal>
        Copyright (c) @year@ The Jakarta Apache Project All rights reserved.
        $Revision: 1.1 $ $Date: 2002/09/30 18:34:43 $
      </legal>
    </footer>
  </document>
  
  
  
  1.1                  jakarta-avalon-excalibur/event/src/xdocs/mpool-howto.xml
  
  Index: mpool-howto.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <document>
    <header>
      <title>Excalibur Event - How To Use MPool</title>
      <authors>
        <person name="Berin Loritsch" email="bloritsch@apache.org"/>
      </authors>
    </header>
    <body>
      <s1 title="Setting Up the PoolManager">
        <p>
          In order to set up a CommandManager.  For those instructions,
          follow <link href="command-howto.html">the Command "How To"</link>.
          From there, you want to set up the PoolManager using the following
          code:
        </p>
        <source>
          <![CDATA[
  // Using the CommandManager in the variable "commandManager"
  
  PoolManager poolManager = new DefaultPoolManager( commandManager );
          ]]>
        </source>
      </s1>
      <s1 title="Creating Your Pool">
        <p>
          The PoolManager is responsible for manufacturing managed pools,
          and for managing their sizes.  All PoolManager managed pools are
          "soft" limiting.  They will continue to grow while they are being
          accessed heavily, but it will shrink during times of inactivity.
          To create your pool, use the following code:
        </p>
        <source>
          <![CDATA[
  int initialEntries = 20;
  ObjectFactory objectFactory = new MySpecialObjectFactory();
  
  Pool managedPool = poolManager.getManagedPool( objectFactory, initialEntries );
          ]]>
        </source>
        <s2 title="Writing an ObjectFactory">
          <p>
            Writing an Object Factory is not that difficult.  You just need to
            implement the ObjectFactory interface.  Below is an example
            implementation:
          </p>
            <source>
              <![CDATA[
  public class MySpecialObjectFactory implements ObjectFactory
  {
      private final Class m_mySpecialClass;
  
      /** Create default object type */
      public MySpecialObjectFactory()
      {
          this( MySpecialObject.class );
      }
  
      /** Create generic object type */
      public MySpecialObjectFactory( Class specialClass )
      {
          if ( null == specialClass )
          {
              throw new IllegalArgumentException ("Class cannot be null");
          }
  
          m_mySpecialClass = specialClass;
      }
  
      /** Implement the getCreatedClass() method */
      public Class getCreatedClass()
      {
          return m_mySpecialClass;
      }
  
      /** Create an instance */
      public Object newInstance()
          throws Exception
      {
          return getCreatedClass().newInstance();
      }
  
      /** Dispose of an instance */
      public void dispose( Object obj )
      {
          // perform permanent cleanup code
      }
  }
              ]]>
            </source>
        </s2>
        <s2 title="Unmanaged Pools">
          <p>
            There are two unmanaged pool types in MPool:
            FixedSizePool and BlockingFixedSizePool.  They are
            similar to one another, but differ in how they respond
            to insufficient resources.  The FixedSizePool fails fast,
            and throws an exception.  The BlockingFixedSizePool tries
            to wait for a specified number of milliseconds.
          </p>
          <p>
            The Fixed Size Pools are not managed because they will only
            have a certain number of pooled objects at any time.  They
            will never grow or shrink.  They are useful for instances
            where the number of elements are known in advanced.  One
            example is a JDBC connection pool because some vendors require
            you to pay per connection licensing fees.
          </p>
        </s2>
      </s1>
      <s1 title="Using the Pool">
        <p>
          Using the pools are quite simple:
        </p>
        <source>
          <![CDATA[
  Object pooledResource = managedPool.acquire();
  
  // do whatever I want with the pooled resource
  
  managedPool.release( pooledResource );
          ]]>
        </source>
        <p>
          What if we have an object that needs to perform some simple
          clieanup?  Have your Object implement the <code>Resettable</code>
          interface.  What if we are migrating from the old Pool package?
          you don't have to do anything.  MPool knows about the old Pool
          package, and will check for its recyclable method.  It will only
          call the Resettable.reset() method if your object implements both
          interfaces.  Both of these will work:
        </p>
        <source>
          <![CDATA[
  import org.apache.excalibur.mpool.Resettable;
  
  public class ResettableObject implements Resettable
  {
      // All the methods and stuff for the real object...
  
      public void reset()
      {
          // perform small cleanup code...
      }
  }
          ]]>
        </source>
        <source>
          <![CDATA[
  import org.apache.avalon.excalibur.pool.Recyclable;
  
  public class ResettableObject implements Recyclable
  {
      // All the methods and stuff for the real object...
  
      public void recycle()
      {
          // perform small cleanup code...
      }
  }
          ]]>
        </source>
      </s1>
    </body>
    <footer>
      <legal>
        Copyright (c) @year@ The Jakarta Apache Project All rights reserved.
        $Revision: 1.1 $ $Date: 2002/09/30 18:34:43 $
      </legal>
    </footer>
  </document>
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>