mbecke      2004/06/24 20:34:56

  Modified:    httpclient/src/java/org/apache/commons/httpclient
                        HttpMethodDirector.java
                        MultiThreadedHttpConnectionManager.java
                        HttpConnection.java
               httpclient/src/test/org/apache/commons/httpclient
                        TestLocalHostBase.java TestHttpConnection.java
                        TestHttpConnectionManager.java
  Log:
  Adds MultiThreadedHttpConnectionManager.deleteClosedConnections() and 
HttpConnection.closeIfStale().
  
  PR: 29383
  Submitted by: Michael Becke and Oleg Kalnichevski
  Reviewed by: Oleg Kalnichevski, Michael Becke and Roland Weber
  
  Revision  Changes    Path
  1.27      +7 -4      
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodDirector.java
  
  Index: HttpMethodDirector.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpMethodDirector.java,v
  retrieving revision 1.26
  retrieving revision 1.27
  diff -u -r1.26 -r1.27
  --- HttpMethodDirector.java   12 Jun 2004 22:47:23 -0000      1.26
  +++ HttpMethodDirector.java   25 Jun 2004 03:34:56 -0000      1.27
  @@ -351,6 +351,9 @@
                   if (LOG.isTraceEnabled()) {
                       LOG.trace("Attempt number " + execCount + " to process 
request");
                   }
  +                if (this.conn.getParams().isStaleCheckingEnabled()) {
  +                    this.conn.closeIfStale();
  +                }
                   if (!this.conn.isOpen()) {
                       // this connection must be opened before it can be used
                       // This has nothing to do with opening a secure tunnel
  @@ -414,7 +417,7 @@
               releaseConnection = true;
               throw e;
           } catch (RuntimeException e) {
  -            if (this.conn.isOpen()) {
  +            if (this.conn.isOpen) {
                   LOG.debug("Closing the connection.");
                   this.conn.close();
               }
  
  
  
  1.40      +106 -28   
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java
  
  Index: MultiThreadedHttpConnectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/MultiThreadedHttpConnectionManager.java,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- MultiThreadedHttpConnectionManager.java   13 May 2004 04:03:25 -0000      1.39
  +++ MultiThreadedHttpConnectionManager.java   25 Jun 2004 03:34:56 -0000      1.40
  @@ -527,30 +527,72 @@
       }
   
       /**
  +     * Gets the total number of pooled connections for the given host 
configuration.  This 
  +     * is the total number of connections that have been created and are still in 
use 
  +     * by this connection manager for the host configuration.  This value will
  +     * not exceed the [EMAIL PROTECTED] #getMaxConnectionsPerHost() maximum number 
of connections per
  +     * host}.
  +     * 
  +     * @param hostConfiguration The host configuration
  +     * @return The total number of pooled connections
  +     */
  +    public int getConnectionsInPool(HostConfiguration hostConfiguration) {
  +        synchronized (connectionPool) {
  +            HostConnectionPool hostPool = 
connectionPool.getHostPool(hostConfiguration);
  +            return hostPool.numConnections;
  +        }
  +    }
  +
  +    /**
  +     * Gets the total number of pooled connections.  This is the total number of 
  +     * connections that have been created and are still in use by this connection 
  +     * manager.  This value will not exceed the [EMAIL PROTECTED] 
#getMaxTotalConnections() 
  +     * maximum number of connections}.
  +     * 
  +     * @return the total number of pooled connections
  +     */
  +    public int getConnectionsInPool() {
  +        synchronized (connectionPool) {
  +            return connectionPool.numConnections;
  +        }
  +    }
  +    
  +    /**
        * Gets the number of connections in use for this configuration.
        *
        * @param hostConfiguration the key that connections are tracked on
        * @return the number of connections in use
  +     * 
  +     * @deprecated Use [EMAIL PROTECTED] #getConnectionsInPool(HostConfiguration)}
        */
       public int getConnectionsInUse(HostConfiguration hostConfiguration) {
  -        synchronized (connectionPool) {
  -            HostConnectionPool hostPool = 
connectionPool.getHostPool(hostConfiguration);
  -            return hostPool.numConnections;
  -        }
  +        return getConnectionsInPool(hostConfiguration);
       }
   
       /**
        * Gets the total number of connections in use.
        * 
        * @return the total number of connections in use
  +     * 
  +     * @deprecated Use [EMAIL PROTECTED] #getConnectionsInPool()}
        */
       public int getConnectionsInUse() {
  -        synchronized (connectionPool) {
  -            return connectionPool.numConnections;
  -        }
  +        return getConnectionsInPool();
       }
   
       /**
  +     * Deletes all closed connections.  Only connections currently owned by the 
connection
  +     * manager are processed.
  +     * 
  +     * @see HttpConnection#isClosed()
  +     * 
  +     * @since 3.0
  +     */
  +    public void deleteClosedConnections() {
  +        connectionPool.deleteClosedConnections();
  +    }
  +    
  +    /**
        * @since 3.0
        */
       public void closeIdleConnections(long idleTimeout) {
  @@ -794,6 +836,22 @@
               }
               return connection;
           }
  +        
  +        /**
  +         * Deletes all closed connections.
  +         */        
  +        public synchronized void deleteClosedConnections() {
  +            
  +            Iterator iter = freeConnections.iterator();
  +            
  +            while (iter.hasNext()) {
  +                HttpConnection conn = (HttpConnection) iter.next();
  +                if (!conn.isOpen()) {
  +                    iter.remove();
  +                    deleteConnection(conn);
  +                }
  +            }
  +        }
   
           /**
            * Closes idle connections.
  @@ -804,31 +862,43 @@
           }
           
           /**
  -         * Close and delete an old, unused connection to make room for a new one.
  +         * Deletes the given connection.  This will remove all reference to the 
connection
  +         * so that it can be GCed.
  +         * 
  +         * <p><b>Note:</b> Does not remove the connection from the freeConnections 
list.  It
  +         * is assumed that the caller has already handled this case.</p>
  +         * 
  +         * @param connection The connection to delete
            */
  -        public synchronized void deleteLeastUsedConnection() {
  +        private synchronized void deleteConnection(HttpConnection connection) {
  +            
  +            HostConfiguration connectionConfiguration = 
configurationForConnection(connection);
   
  -            HttpConnection connection = (HttpConnection) 
freeConnections.removeFirst();
  +            if (LOG.isDebugEnabled()) {
  +                LOG.debug("Reclaiming connection, hostConfig=" + 
connectionConfiguration);
  +            }
   
  -            if (connection != null) {
  -                HostConfiguration connectionConfiguration = 
configurationForConnection(connection);
  +            connection.close();
   
  -                if (LOG.isDebugEnabled()) {
  -                    LOG.debug("Reclaiming unused connection, hostConfig=" 
  -                        + connectionConfiguration);
  -                }
  +            HostConnectionPool hostPool = getHostPool(connectionConfiguration);
  +            
  +            hostPool.freeConnections.remove(connection);
  +            hostPool.numConnections--;
  +            numConnections--;
   
  -                connection.close();
  +            // remove the connection from the timeout handler
  +            idleConnectionHandler.remove(connection);            
  +        }
  +        
  +        /**
  +         * Close and delete an old, unused connection to make room for a new one.
  +         */
  +        public synchronized void deleteLeastUsedConnection() {
   
  -                HostConnectionPool hostPool = getHostPool(connectionConfiguration);
  -                
  -                hostPool.freeConnections.remove(connection);
  -                hostPool.numConnections--;
  -                numConnections--;
  +            HttpConnection connection = (HttpConnection) 
freeConnections.removeFirst();
   
  -                // remove the connection from the timeout handler
  -                idleConnectionHandler.remove(connection);
  -            
  +            if (connection != null) {
  +                deleteConnection(connection);
               } else if (LOG.isDebugEnabled()) {
                   LOG.debug("Attempted to reclaim an unused connection but there were 
none.");
               }
  @@ -1212,6 +1282,14 @@
           public boolean isOpen() {
               if (hasConnection()) {
                   return wrappedConnection.isOpen();
  +            } else {
  +                return false;
  +            }
  +        }
  +
  +        public boolean closeIfStale() {
  +            if (hasConnection()) {
  +                return wrappedConnection.closeIfStale();
               } else {
                   return false;
               }
  
  
  
  1.95      +22 -10    
jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java
  
  Index: HttpConnection.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/java/org/apache/commons/httpclient/HttpConnection.java,v
  retrieving revision 1.94
  retrieving revision 1.95
  diff -u -r1.94 -r1.95
  --- HttpConnection.java       24 Jun 2004 21:39:52 -0000      1.94
  +++ HttpConnection.java       25 Jun 2004 03:34:56 -0000      1.95
  @@ -383,19 +383,31 @@
       }
   
       /**
  -     * Returns <tt>true</tt> if the connection is open,
  -     * <tt>false</tt> otherwise.
  +     * Tests if the connection is open. 
        *
  -     * @return <tt>true</tt> if the connection is open
  +     * @return <code>true</code> if the connection is open
        */
       public boolean isOpen() {
  -        if (used && isOpen && this.params.isStaleCheckingEnabled() && isStale()) {
  +        return isOpen;
  +    }
  +
  +    /**
  +     * Closes the connection if stale.
  +     * 
  +     * @return <code>true</code> if the connection was stale and therefore closed, 
  +     * <code>false</code> otherwise.
  +     * 
  +     * @see #isStale()
  +     */
  +    public boolean closeIfStale() {
  +        if (used && isOpen && isStale()) {
               LOG.debug("Connection is stale, closing...");
               close();
  +            return true;
           }
  -        return isOpen;
  +        return false;
       }
  -
  +    
       /**
        * Tests if stale checking is enabled.
        * 
  
  
  
  1.6       +17 -8     
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestLocalHostBase.java
  
  Index: TestLocalHostBase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestLocalHostBase.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestLocalHostBase.java    22 Feb 2004 18:08:49 -0000      1.5
  +++ TestLocalHostBase.java    25 Jun 2004 03:34:56 -0000      1.6
  @@ -99,13 +99,22 @@
           } else {
               client = new HttpClient(connectionManager);
           }
  -        
  -        client.getHostConfiguration().setHost(host, port, protocol);
  -        if (proxyHost != null) {
  -            client.getHostConfiguration().setProxy(proxyHost, proxyPort);
  -        }
  +
  +        configureHostConfiguration(client.getHostConfiguration());
   
           return client;
  +    }
  +    
  +    /**
  +     * Configures the host config with the correct host and proxy settings.
  +     * 
  +     * @param hostConfiguration
  +     */
  +    public void configureHostConfiguration(HostConfiguration hostConfiguration) {
  +        hostConfiguration.setHost(host, port, protocol);
  +        if (proxyHost != null) {
  +            hostConfiguration.setProxy(proxyHost, proxyPort);
  +        }
       }
   
       /**
  
  
  
  1.17      +1 -1      
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnection.java
  
  Index: TestHttpConnection.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnection.java,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- TestHttpConnection.java   13 Apr 2004 21:47:29 -0000      1.16
  +++ TestHttpConnection.java   25 Jun 2004 03:34:56 -0000      1.17
  @@ -80,7 +80,7 @@
       public void testConstructThenClose() {
           HttpConnection conn = new HttpConnection(getHost(), getPort());
           conn.close();
  -        assertTrue( ! conn.isOpen() );
  +        assertTrue(!conn.isOpen());
       }
   
       public void testConnTimeoutRelease() {
  
  
  
  1.22      +29 -4     
jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnectionManager.java
  
  Index: TestHttpConnectionManager.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons/httpclient/src/test/org/apache/commons/httpclient/TestHttpConnectionManager.java,v
  retrieving revision 1.21
  retrieving revision 1.22
  diff -u -r1.21 -r1.22
  --- TestHttpConnectionManager.java    13 Apr 2004 21:47:29 -0000      1.21
  +++ TestHttpConnectionManager.java    25 Jun 2004 03:34:56 -0000      1.22
  @@ -583,6 +583,31 @@
                   
       }
       
  +    public void testDeleteClosedConnections() {
  +        
  +        MultiThreadedHttpConnectionManager manager = new 
MultiThreadedHttpConnectionManager();
  +
  +        HostConfiguration hostConfig = new HostConfiguration();
  +        
  +        configureHostConfiguration(hostConfig);
  +        
  +        HttpConnection conn = manager.getConnection(hostConfig);
  +        
  +        assertEquals("connectionsInPool", manager.getConnectionsInPool(), 1);
  +        assertEquals("connectionsInPool(host)", 
manager.getConnectionsInPool(hostConfig), 1);
  +        
  +        conn.close();
  +        conn.releaseConnection();
  +
  +        assertEquals("connectionsInPool", manager.getConnectionsInPool(), 1);
  +        assertEquals("connectionsInPool(host)", 
manager.getConnectionsInPool(hostConfig), 1);
  +
  +        manager.deleteClosedConnections();
  +        
  +        assertEquals("connectionsInPool", manager.getConnectionsInPool(), 0);
  +        assertEquals("connectionsInPool(host)", 
manager.getConnectionsInPool(hostConfig), 0);
  +    }
  +    
       public void testReclaimUnusedConnection() {
   
           MultiThreadedHttpConnectionManager connectionManager = new 
MultiThreadedHttpConnectionManager();
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to