Example usage for org.apache.http.impl.conn.tsccm RouteSpecificPool getRoute

List of usage examples for org.apache.http.impl.conn.tsccm RouteSpecificPool getRoute

Introduction

In this page you can find the example usage for org.apache.http.impl.conn.tsccm RouteSpecificPool getRoute.

Prototype

public final HttpRoute getRoute() 

Source Link

Document

Obtains the route for which this pool is specific.

Usage

From source file:org.apache.http.impl.conn.tsccm.ConnPoolByRoute.java

/**
 * If available, get a free pool entry for a route.
 *
 * @param rospl       the route-specific pool from which to get an entry
 *
 * @return  an available pool entry for the given route, or
 *          <code>null</code> if none is available
 *//*w ww .  j a  v a  2 s. c om*/
protected BasicPoolEntry getFreeEntry(final RouteSpecificPool rospl, final Object state) {

    BasicPoolEntry entry = null;
    poolLock.lock();
    try {
        boolean done = false;
        while (!done) {

            entry = rospl.allocEntry(state);

            if (entry != null) {
                if (log.isDebugEnabled()) {
                    log.debug("Getting free connection" + " [" + rospl.getRoute() + "][" + state + "]");

                }
                freeConnections.remove(entry);
                if (entry.isExpired(System.currentTimeMillis())) {
                    // If the free entry isn't valid anymore, get rid of it
                    // and loop to find another one that might be valid.
                    if (log.isDebugEnabled()) {
                        log.debug("Closing expired free connection" + " [" + rospl.getRoute() + "][" + state
                                + "]");
                    }
                    closeConnection(entry);
                    // We use dropEntry instead of deleteEntry because the entry
                    // is no longer "free" (we just allocated it), and deleteEntry
                    // can only be used to delete free entries.
                    rospl.dropEntry();
                    numConnections--;
                } else {
                    leasedConnections.add(entry);
                    done = true;
                }

            } else {
                done = true;
                if (log.isDebugEnabled()) {
                    log.debug("No free connections" + " [" + rospl.getRoute() + "][" + state + "]");
                }
            }
        }
    } finally {
        poolLock.unlock();
    }
    return entry;
}

From source file:org.apache.http.impl.conn.tsccm.ConnPoolByRoute.java

/**
 * Creates a new pool entry./*from ww w  . j av  a  2  s.c o m*/
 * This method assumes that the new connection will be handed
 * out immediately.
 *
 * @param rospl       the route-specific pool for which to create the entry
 * @param op        the operator for creating a connection
 *
 * @return  the new pool entry for a new connection
 */
protected BasicPoolEntry createEntry(final RouteSpecificPool rospl, final ClientConnectionOperator op) {

    if (log.isDebugEnabled()) {
        log.debug("Creating new connection [" + rospl.getRoute() + "]");
    }

    // the entry will create the connection when needed
    final BasicPoolEntry entry = new BasicPoolEntry(op, rospl.getRoute(), connTTL, connTTLTimeUnit);

    poolLock.lock();
    try {
        rospl.createdEntry(entry);
        numConnections++;
        leasedConnections.add(entry);
    } finally {
        poolLock.unlock();
    }

    return entry;
}

From source file:org.apache.http.impl.conn.tsccm.ConnPoolByRoute.java

/**
 * Notifies a waiting thread that a connection is available.
 * This will wake a thread waiting in the specific route pool,
 * if there is one./* ww  w  .ja  v  a 2 s.c om*/
 * Otherwise, a thread in the connection pool will be notified.
 *
 * @param rospl     the pool in which to notify, or <code>null</code>
 */
protected void notifyWaitingThread(final RouteSpecificPool rospl) {

    //@@@ while this strategy provides for best connection re-use,
    //@@@ is it fair? only do this if the connection is open?
    // Find the thread we are going to notify. We want to ensure that
    // each waiting thread is only interrupted once, so we will remove
    // it from all wait queues before interrupting.
    WaitingThread waitingThread = null;

    poolLock.lock();
    try {

        if ((rospl != null) && rospl.hasThread()) {
            if (log.isDebugEnabled()) {
                log.debug("Notifying thread waiting on pool" + " [" + rospl.getRoute() + "]");
            }
            waitingThread = rospl.nextThread();
        } else if (!waitingThreads.isEmpty()) {
            if (log.isDebugEnabled()) {
                log.debug("Notifying thread waiting on any pool");
            }
            waitingThread = waitingThreads.remove();
        } else if (log.isDebugEnabled()) {
            log.debug("Notifying no-one, there are no waiting threads");
        }

        if (waitingThread != null) {
            waitingThread.wakeup();
        }

    } finally {
        poolLock.unlock();
    }
}