001: /*
002: * $Header: /home/jerenkrantz/tmp/commons/commons-convert/cvs/home/cvs/jakarta-commons//httpclient/src/java/org/apache/commons/httpclient/util/IdleConnectionTimeoutThread.java,v 1.2 2004/05/13 02:40:36 mbecke Exp $
003: * $Revision: 480424 $
004: * $Date: 2006-11-29 06:56:49 +0100 (Wed, 29 Nov 2006) $
005: *
006: * ====================================================================
007: *
008: * Licensed to the Apache Software Foundation (ASF) under one or more
009: * contributor license agreements. See the NOTICE file distributed with
010: * this work for additional information regarding copyright ownership.
011: * The ASF licenses this file to You under the Apache License, Version 2.0
012: * (the "License"); you may not use this file except in compliance with
013: * the License. You may obtain a copy of the License at
014: *
015: * http://www.apache.org/licenses/LICENSE-2.0
016: *
017: * Unless required by applicable law or agreed to in writing, software
018: * distributed under the License is distributed on an "AS IS" BASIS,
019: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
020: * See the License for the specific language governing permissions and
021: * limitations under the License.
022: * ====================================================================
023: *
024: * This software consists of voluntary contributions made by many
025: * individuals on behalf of the Apache Software Foundation. For more
026: * information on the Apache Software Foundation, please see
027: * <http://www.apache.org/>.
028: *
029: */
030: package org.apache.commons.httpclient.util;
031:
032: import java.util.ArrayList;
033: import java.util.Iterator;
034: import java.util.List;
035:
036: import org.apache.commons.httpclient.HttpConnectionManager;
037:
038: /**
039: * A utility class for periodically closing idle connections.
040: *
041: * @see org.apache.commons.httpclient.HttpConnectionManager#closeIdleConnections(long)
042: *
043: * @since 3.0
044: */
045: public class IdleConnectionTimeoutThread extends Thread {
046:
047: private List connectionManagers = new ArrayList();
048:
049: private boolean shutdown = false;
050:
051: private long timeoutInterval = 1000;
052:
053: private long connectionTimeout = 3000;
054:
055: public IdleConnectionTimeoutThread() {
056: setDaemon(true);
057: }
058:
059: /**
060: * Adds a connection manager to be handled by this class.
061: * {@link HttpConnectionManager#closeIdleConnections(long)} will be called on the connection
062: * manager every {@link #setTimeoutInterval(long) timeoutInterval} milliseconds.
063: *
064: * @param connectionManager The connection manager to add
065: */
066: public synchronized void addConnectionManager(
067: HttpConnectionManager connectionManager) {
068: if (shutdown) {
069: throw new IllegalStateException(
070: "IdleConnectionTimeoutThread has been shutdown");
071: }
072: this .connectionManagers.add(connectionManager);
073: }
074:
075: /**
076: * Removes the connection manager from this class. The idle connections from the connection
077: * manager will no longer be automatically closed by this class.
078: *
079: * @param connectionManager The connection manager to remove
080: */
081: public synchronized void removeConnectionManager(
082: HttpConnectionManager connectionManager) {
083: if (shutdown) {
084: throw new IllegalStateException(
085: "IdleConnectionTimeoutThread has been shutdown");
086: }
087: this .connectionManagers.remove(connectionManager);
088: }
089:
090: /**
091: * Handles calling {@link HttpConnectionManager#closeIdleConnections(long) closeIdleConnections()}
092: * and doing any other cleanup work on the given connection mangaer.
093: * @param connectionManager The connection manager to close idle connections for
094: */
095: protected void handleCloseIdleConnections(
096: HttpConnectionManager connectionManager) {
097: connectionManager.closeIdleConnections(connectionTimeout);
098: }
099:
100: /**
101: * Closes idle connections.
102: */
103: public synchronized void run() {
104: while (!shutdown) {
105: Iterator iter = connectionManagers.iterator();
106:
107: while (iter.hasNext()) {
108: HttpConnectionManager connectionManager = (HttpConnectionManager) iter
109: .next();
110: handleCloseIdleConnections(connectionManager);
111: }
112:
113: try {
114: this .wait(timeoutInterval);
115: } catch (InterruptedException e) {
116: }
117: }
118: // clear out the connection managers now that we're shutdown
119: this .connectionManagers.clear();
120: }
121:
122: /**
123: * Stops the thread used to close idle connections. This class cannot be used once shutdown.
124: */
125: public synchronized void shutdown() {
126: this .shutdown = true;
127: this .notifyAll();
128: }
129:
130: /**
131: * Sets the timeout value to use when testing for idle connections.
132: *
133: * @param connectionTimeout The connection timeout in milliseconds
134: *
135: * @see HttpConnectionManager#closeIdleConnections(long)
136: */
137: public synchronized void setConnectionTimeout(long connectionTimeout) {
138: if (shutdown) {
139: throw new IllegalStateException(
140: "IdleConnectionTimeoutThread has been shutdown");
141: }
142: this .connectionTimeout = connectionTimeout;
143: }
144:
145: /**
146: * Sets the interval used by this class between closing idle connections. Idle
147: * connections will be closed every <code>timeoutInterval</code> milliseconds.
148: *
149: * @param timeoutInterval The timeout interval in milliseconds
150: */
151: public synchronized void setTimeoutInterval(long timeoutInterval) {
152: if (shutdown) {
153: throw new IllegalStateException(
154: "IdleConnectionTimeoutThread has been shutdown");
155: }
156: this.timeoutInterval = timeoutInterval;
157: }
158:
159: }
|