cvs commit: spice/components/netserve/src/java/org/jcomponent/netserve/connection/handlers ThreadPerRequestHandler.java

Peter Donald <[email protected]>
Newsgroups gmane.comp.java.spice.cvs
Message-ID <[email protected]>
donaldp     03/10/28 19:51:59

  Modified:    components/netserve/src/java/org/jcomponent/netserve/connection/handlers
                        ThreadPerRequestHandler.java
  Log:
  Add in shutdown of worker thread for per-thread handler and unit test it
  
  Revision  Changes    Path
  1.6       +64 -2     spice/components/netserve/src/java/org/jcomponent/netserve/connection/handlers/ThreadPerRequestHandler.java
  
  Index: ThreadPerRequestHandler.java
  ===================================================================
  RCS file: /cvsroot/spice/spice/components/netserve/src/java/org/jcomponent/netserve/connection/handlers/ThreadPerRequestHandler.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- ThreadPerRequestHandler.java	27 Oct 2003 05:34:57 -0000	1.5
  +++ ThreadPerRequestHandler.java	29 Oct 2003 03:51:58 -0000	1.6
  @@ -8,19 +8,28 @@
   package org.jcomponent.netserve.connection.handlers;
   
   import java.net.Socket;
  +import java.util.Map;
  +import java.util.Hashtable;
  +import java.util.Collection;
   import org.jcomponent.netserve.connection.RequestHandler;
   import org.jcomponent.threadpool.ThreadPool;
  +import org.jcomponent.threadpool.ThreadControl;
   
   /**
    * A Handler that uses a thread from a pool for each different request.
    *
    * @author <a href="mailto:peter at realityforge.org">Peter Donald</a>
  - * @version $Revision: 1.5 $ $Date: 2003/10/27 05:34:57 $
  + * @version $Revision: 1.6 $ $Date: 2003/10/29 03:51:58 $
    */
   public class ThreadPerRequestHandler
       extends DelegatingRequestHandler
   {
       /**
  +     * A map of Socket->ThreadControl.
  +     */
  +    private final Map m_controlMap = new Hashtable();
  +
  +    /**
        * the thread pool that used to handle requests.
        */
       private final ThreadPool m_threadPool;
  @@ -50,6 +59,59 @@
       public void handleConnection( final Socket socket )
       {
           final Runnable runnable = createRunnable( socket );
  -        m_threadPool.execute( runnable );
  +        final ThreadControl control = m_threadPool.execute( runnable );
  +        m_controlMap.put( socket, control );
  +    }
  +
  +    /**
  +     * Remove ThreadControl from list of active threads.
  +     *
  +     * @param socket the socket
  +     */
  +    protected void endConnection( Socket socket )
  +    {
  +        m_controlMap.remove( socket );
  +        super.endConnection( socket );
  +    }
  +
  +    /**
  +     * Shutdown all requests including those executing in thread pool.
  +     *
  +     * @param timeout the timeout
  +     */
  +    public void shutdown( final long timeout )
  +    {
  +        markAsShutdown();
  +        final ThreadControl[] controls;
  +        synchronized( m_controlMap )
  +        {
  +            final Collection collection = m_controlMap.values();
  +            controls = (ThreadControl[])collection.
  +                toArray( new ThreadControl[ collection.size() ] );
  +        }
  +        for( int i = 0; i < controls.length; i++ )
  +        {
  +            final ThreadControl control = controls[ i ];
  +            if( !control.isFinished() )
  +            {
  +                control.interrupt();
  +            }
  +        }
  +        super.shutdown( timeout );
  +        for( int i = 0; i < controls.length; i++ )
  +        {
  +            final ThreadControl control = controls[ i ];
  +            if( !control.isFinished() )
  +            {
  +                try
  +                {
  +                    control.join( timeout );
  +                }
  +                catch( final InterruptedException ie )
  +                {
  +                    //Ignore
  +                }
  +            }
  +        }
       }
   }
  
  
  


-------------------------------------------------------
This SF.net email is sponsored by: SF.net Giveback Program.
Does SourceForge.net help you be more productive?  Does it
help you create better code?   SHARE THE LOVE, and help us help
YOU!  Click Here: http://sourceforge.net/donate/
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.