Fields Summary |
---|
private final Log | log |
protected final Lock | poolLockThe global lock for this pool. |
protected Set | issuedConnectionsReferences to issued connections.
Objects in this set are of class
{@link BasicPoolEntryRef BasicPoolEntryRef},
and point to the pool entry for the issued connection.
GCed connections are detected by the missing pool entries. |
protected IdleConnectionHandler | idleConnHandlerThe handler for idle connections. |
protected int | numConnectionsThe current total number of connections. |
protected ReferenceQueue | refQueueA reference queue to track loss of pool entries to GC.
The same queue is used to track loss of the connection manager,
so we cannot specialize the type. |
private RefQueueWorker | refWorkerA worker (thread) to track loss of pool entries to GC. |
protected volatile boolean | isShutDownIndicates whether this pool is shut down. |
Methods Summary |
---|
protected void | closeConnection(org.apache.http.conn.OperatedClientConnection conn)Closes a connection from this pool.
if (conn != null) {
try {
conn.close();
} catch (IOException ex) {
log.debug("I/O error closing connection", ex);
}
}
|
public void | closeExpiredConnections()
poolLock.lock();
try {
idleConnHandler.closeExpiredConnections();
} finally {
poolLock.unlock();
}
|
public void | closeIdleConnections(long idletime, java.util.concurrent.TimeUnit tunit)Closes idle connections.
// idletime can be 0 or negative, no problem there
if (tunit == null) {
throw new IllegalArgumentException("Time unit must not be null.");
}
poolLock.lock();
try {
idleConnHandler.closeIdleConnections(tunit.toMillis(idletime));
} finally {
poolLock.unlock();
}
|
public abstract void | deleteClosedConnections()Deletes all entries for closed connections.
|
public void | enableConnectionGC()Enables connection garbage collection (GC).
This method must be called immediately after creating the
connection pool. It is not possible to enable connection GC
after pool entries have been created. Neither is it possible
to disable connection GC.
if (refQueue != null) {
throw new IllegalStateException("Connection GC already enabled.");
}
poolLock.lock();
try {
if (numConnections > 0) { //@@@ is this check sufficient?
throw new IllegalStateException("Pool already in use.");
}
} finally {
poolLock.unlock();
}
refQueue = new ReferenceQueue<Object>();
refWorker = new RefQueueWorker(refQueue, this);
Thread t = new Thread(refWorker); //@@@ use a thread factory
t.setDaemon(true);
t.setName("RefQueueWorker@" + this);
t.start();
|
public abstract void | freeEntry(org.apache.http.impl.conn.tsccm.BasicPoolEntry entry, boolean reusable, long validDuration, java.util.concurrent.TimeUnit timeUnit)Returns an entry into the pool.
The connection of the entry is expected to be in a suitable state,
either open and re-usable, or closed. The pool will not make any
attempt to determine whether it can be re-used or not.
|
public final org.apache.http.impl.conn.tsccm.BasicPoolEntry | getEntry(org.apache.http.conn.routing.HttpRoute route, java.lang.Object state, long timeout, java.util.concurrent.TimeUnit tunit)Obtains a pool entry with a connection within the given timeout.
return requestPoolEntry(route, state).getPoolEntry(timeout, tunit);
|
protected abstract void | handleLostEntry(org.apache.http.conn.routing.HttpRoute route)Handles cleaning up for a lost pool entry with the given route.
A lost pool entry corresponds to a connection that was
garbage collected instead of being properly released.
|
public void | handleReference(java.lang.ref.Reference ref)
// END android-changed
poolLock.lock();
try {
if (ref instanceof BasicPoolEntryRef) {
// check if the GCed pool entry was still in use
//@@@ find a way to detect this without lookup
//@@@ flag in the BasicPoolEntryRef, to be reset when freed?
final boolean lost = issuedConnections.remove(ref);
if (lost) {
final HttpRoute route =
((BasicPoolEntryRef)ref).getRoute();
if (log.isDebugEnabled()) {
log.debug("Connection garbage collected. " + route);
}
handleLostEntry(route);
}
}
} finally {
poolLock.unlock();
}
|
public abstract org.apache.http.impl.conn.tsccm.PoolEntryRequest | requestPoolEntry(org.apache.http.conn.routing.HttpRoute route, java.lang.Object state)Returns a new {@link PoolEntryRequest}, from which a {@link BasicPoolEntry}
can be obtained, or the request can be aborted.
|
public void | shutdown()Shuts down this pool and all associated resources.
Overriding methods MUST call the implementation here!
poolLock.lock();
try {
if (isShutDown)
return;
// no point in monitoring GC anymore
if (refWorker != null)
refWorker.shutdown();
// close all connections that are issued to an application
Iterator<BasicPoolEntryRef> iter = issuedConnections.iterator();
while (iter.hasNext()) {
BasicPoolEntryRef per = iter.next();
iter.remove();
BasicPoolEntry entry = per.get();
if (entry != null) {
closeConnection(entry.getConnection());
}
}
// remove all references to connections
//@@@ use this for shutting them down instead?
idleConnHandler.removeAll();
isShutDown = true;
} finally {
poolLock.unlock();
}
|