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.nio.conn; 28 29 import java.io.IOException; 30 import java.util.concurrent.Future; 31 import java.util.concurrent.TimeUnit; 32 33 import org.apache.http.concurrent.FutureCallback; 34 import org.apache.http.conn.routing.HttpRoute; 35 import org.apache.http.nio.NHttpClientConnection; 36 import org.apache.http.nio.reactor.IOEventDispatch; 37 import org.apache.http.protocol.HttpContext; 38 39 /** 40 * Represents a manager of persistent client connections. 41 * <p> 42 * The purpose of an HTTP connection manager is to serve as a factory for new 43 * HTTP connections, manage persistent connections and synchronize access to 44 * persistent connections making sure that only one thread of execution can 45 * have access to a connection at a time. 46 * <p> 47 * Implementations of this interface must be thread-safe. Access to shared 48 * data must be synchronized as methods of this interface may be executed 49 * from multiple threads. 50 * 51 * @since 4.0 52 */ 53 public interface NHttpClientConnectionManager { 54 55 /** 56 * Returns a {@link Future} for a {@link NHttpClientConnection}. 57 * <p> 58 * Please note that the consumer of that connection is responsible 59 * for fully establishing the route the to the connection target 60 * by calling {@link #startRoute(org.apache.http.nio.NHttpClientConnection, 61 * org.apache.http.conn.routing.HttpRoute, 62 * org.apache.http.protocol.HttpContext) startRoute} in order to start 63 * the process of connection initialization, optionally calling 64 * {@link #upgrade(org.apache.http.nio.NHttpClientConnection, 65 * org.apache.http.conn.routing.HttpRoute, 66 * org.apache.http.protocol.HttpContext) upgrade} method to upgrade 67 * the connection after having executed {@code CONNECT} method to 68 * all intermediate proxy hops and and finally calling 69 * {@link #routeComplete(org.apache.http.nio.NHttpClientConnection, 70 * org.apache.http.conn.routing.HttpRoute, 71 * org.apache.http.protocol.HttpContext) routeComplete} to mark the route 72 * as fully completed. 73 * 74 * @param route HTTP route of the requested connection. 75 * @param state expected state of the connection or {@code null} 76 * if the connection is not expected to carry any state. 77 * @param connectTimeout connect timeout. 78 * @param connectionRequestTimeout connection request timeout. 79 * @param timeUnit time unit of the previous two timeout values. 80 * @param callback future callback. 81 */ 82 Future<NHttpClientConnection> requestConnection( 83 HttpRoute route, 84 Object state, 85 long connectTimeout, 86 long connectionRequestTimeout, 87 TimeUnit timeUnit, 88 FutureCallback<NHttpClientConnection> callback); 89 90 /** 91 * Releases the connection back to the manager making it potentially 92 * re-usable by other consumers. Optionally, the maximum period 93 * of how long the manager should keep the connection alive can be 94 * defined using {@code validDuration} and {@code timeUnit} 95 * parameters. 96 * 97 * @param conn the managed connection to release. 98 * @param validDuration the duration of time this connection is valid for reuse. 99 * @param timeUnit the time unit. 100 * 101 * @see #closeExpiredConnections() 102 */ 103 void releaseConnection( 104 NHttpClientConnection conn, Object newState, long validDuration, TimeUnit timeUnit); 105 106 /** 107 * Starts the process of connection initialization. Connection route may consist of several 108 * intermediate hops and may require a protocol upgrade. Once the route is fully established 109 * the {@link #routeComplete(org.apache.http.nio.NHttpClientConnection, 110 * org.apache.http.conn.routing.HttpRoute, 111 * org.apache.http.protocol.HttpContext) routeComplete} method must be called. 112 * 113 * @param conn the managed connection to initialize. 114 * @param route the connection route. 115 * @param context the context 116 */ 117 void startRoute( 118 NHttpClientConnection conn, 119 HttpRoute route, 120 HttpContext context) throws IOException; 121 122 /** 123 * Upgrades the underlying connection I/O session to TLS/SSL (or another layering 124 * protocol) after having executed {@code CONNECT} method to all 125 * intermediate proxy hops. 126 * 127 * @param conn the managed connection to upgrade. 128 * @param route the connection route. 129 * @param context the context 130 */ 131 void upgrade( 132 NHttpClientConnection conn, 133 HttpRoute route, 134 HttpContext context) throws IOException; 135 136 /** 137 * Marks the connection as fully established with all its intermediate 138 * hops completed. 139 * 140 * @param conn the managed connection to mark as route complete. 141 * @param route the connection route. 142 * @param context the context 143 */ 144 void routeComplete( 145 NHttpClientConnection conn, 146 HttpRoute route, 147 HttpContext context); 148 149 /** 150 * Determines if the given connection has been fully established and 151 * marked as route complete. 152 * 153 * @param conn the managed connection. 154 */ 155 boolean isRouteComplete(NHttpClientConnection conn); 156 157 /** 158 * Closes idle connections in the pool. 159 * <p> 160 * Open connections in the pool that have not been used for the 161 * timespan given by the argument will be closed. 162 * Currently allocated connections are not subject to this method. 163 * Times will be checked with milliseconds precision 164 * 165 * All expired connections will also be closed. 166 * 167 * @param idletime the idle time of connections to be closed 168 * @param timeUnit the unit for the {@code idletime} 169 * 170 * @see #closeExpiredConnections() 171 */ 172 void closeIdleConnections(long idletime, TimeUnit timeUnit); 173 174 /** 175 * Closes all expired connections in the pool. 176 * <p> 177 * Open connections in the pool that have not been used for 178 * the timespan defined when the connection was released will be closed. 179 * Currently allocated connections are not subject to this method. 180 * Times will be checked with milliseconds precision. 181 */ 182 void closeExpiredConnections(); 183 184 /** 185 * Starts the underlying I/O reactor and initiates the dispatch of 186 * I/O event notifications to the given {@link IOEventDispatch}. 187 */ 188 void execute(IOEventDispatch eventDispatch) throws IOException; 189 190 /** 191 * Shuts down this connection manager and releases allocated resources. 192 * This includes closing all connections, whether they are currently 193 * used or not. 194 */ 195 void shutdown() throws IOException; 196 197 }