View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
25   *
26   */
27  package org.apache.http.conn;
28  
29  import java.io.IOException;
30  import java.util.concurrent.TimeUnit;
31  
32  import org.apache.http.HttpClientConnection;
33  import org.apache.http.conn.routing.HttpRoute;
34  import org.apache.http.protocol.HttpContext;
35  
36  /**
37   * Represents a manager of persistent client connections.
38   * <p>
39   * The purpose of an HTTP connection manager is to serve as a factory for new
40   * HTTP connections, manage persistent connections and synchronize access to
41   * persistent connections making sure that only one thread of execution can
42   * have access to a connection at a time.
43   * </p>
44   * <p>
45   * Implementations of this interface must be thread-safe. Access to shared
46   * data must be synchronized as methods of this interface may be executed
47   * from multiple threads.
48   * </p>
49   *
50   * @since 4.3
51   */
52  public interface HttpClientConnectionManager {
53  
54      /**
55       * Returns a new {@link ConnectionRequest}, from which a
56       * {@link HttpClientConnection} can be obtained or the request can be
57       * aborted.
58       * <p>
59       * Please note that newly allocated connections can be returned
60       * in the closed state. The consumer of that connection is responsible
61       * for fully establishing the route the to the connection target
62       * by calling {@link #connect(org.apache.http.HttpClientConnection,
63       *   org.apache.http.conn.routing.HttpRoute, int,
64       *   org.apache.http.protocol.HttpContext) connect} in order to connect
65       * directly to the target or to the first proxy hop, optionally calling
66       * {@link #upgrade(org.apache.http.HttpClientConnection,
67       *   org.apache.http.conn.routing.HttpRoute,
68       *   org.apache.http.protocol.HttpContext) upgrade} method to upgrade
69       * the connection after having executed {@code CONNECT} method to
70       * all intermediate proxy hops and and finally calling {@link #routeComplete(
71       *  org.apache.http.HttpClientConnection,
72       *  org.apache.http.conn.routing.HttpRoute,
73       *  org.apache.http.protocol.HttpContext) routeComplete} to mark the route
74       *  as fully completed.
75       * </p>
76       *
77       * @param route HTTP route of the requested connection.
78       * @param state expected state of the connection or {@code null}
79       *              if the connection is not expected to carry any state.
80       */
81      ConnectionRequest requestConnection(HttpRoute route, Object state);
82  
83      /**
84       * Releases the connection back to the manager making it potentially
85       * re-usable by other consumers. Optionally, the maximum period
86       * of how long the manager should keep the connection alive can be
87       * defined using {@code validDuration} and {@code timeUnit}
88       * parameters.
89       *
90       * @param conn      the managed connection to release.
91       * @param validDuration the duration of time this connection is valid for reuse.
92       * @param timeUnit the time unit.
93       *
94       * @see #closeExpiredConnections()
95       */
96      void releaseConnection(
97              HttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit);
98  
99      /**
100      * Connects the underlying connection socket to the connection target in case
101      * of a direct route or to the first proxy hop in case of a route via a proxy
102      * (or multiple proxies).
103      *
104      * @param conn the managed connection.
105      * @param route the route of the connection.
106      * @param connectTimeout connect timeout in milliseconds.
107      * @param context the actual HTTP context.
108      * @throws IOException
109      */
110     void connect(
111             HttpClientConnection conn,
112             HttpRoute route,
113             int connectTimeout,
114             HttpContext context) throws IOException;
115 
116     /**
117      * Upgrades the underlying connection socket to TLS/SSL (or another layering
118      * protocol) after having executed {@code CONNECT} method to all
119      * intermediate proxy hops
120      *
121      * @param conn the managed connection.
122      * @param route the route of the connection.
123      * @param context the actual HTTP context.
124      * @throws IOException
125      */
126     void upgrade(
127             HttpClientConnection conn,
128             HttpRoute route,
129             HttpContext context) throws IOException;
130 
131     /**
132      * Marks the connection as fully established with all its intermediate
133      * hops completed.
134      *
135      * @param conn the managed connection.
136      * @param route the route of the connection.
137      * @param context the actual HTTP context.
138      * @throws IOException
139      */
140     void routeComplete(
141             HttpClientConnection conn,
142             HttpRoute route,
143             HttpContext context) throws IOException;
144 
145     /**
146      * Closes idle connections in the pool.
147      * <p>
148      * Open connections in the pool that have not been used for the
149      * timespan given by the argument will be closed.
150      * Currently allocated connections are not subject to this method.
151      * Times will be checked with milliseconds precision
152      * </p>
153      * <p>
154      * All expired connections will also be closed.
155      * </p>
156      *
157      * @param idletime  the idle time of connections to be closed
158      * @param timeUnit     the unit for the {@code idletime}
159      *
160      * @see #closeExpiredConnections()
161      */
162     void closeIdleConnections(long idletime, TimeUnit timeUnit);
163 
164     /**
165      * Closes all expired connections in the pool.
166      * <p>
167      * Open connections in the pool that have not been used for
168      * the timespan defined when the connection was released will be closed.
169      * Currently allocated connections are not subject to this method.
170      * Times will be checked with milliseconds precision.
171      * </p>
172      */
173     void closeExpiredConnections();
174 
175     /**
176      * Shuts down this connection manager and releases allocated resources.
177      * This includes closing all connections, whether they are currently
178      * used or not.
179      */
180     void shutdown();
181 
182 }