1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package org.apache.http.impl.conn.tsccm;
28
29 import java.io.IOException;
30 import java.util.concurrent.TimeUnit;
31
32 import org.apache.commons.logging.Log;
33 import org.apache.commons.logging.LogFactory;
34 import org.apache.http.annotation.ThreadSafe;
35 import org.apache.http.conn.ClientConnectionManager;
36 import org.apache.http.conn.ClientConnectionOperator;
37 import org.apache.http.conn.ClientConnectionRequest;
38 import org.apache.http.conn.ConnectionPoolTimeoutException;
39 import org.apache.http.conn.ManagedClientConnection;
40 import org.apache.http.conn.OperatedClientConnection;
41 import org.apache.http.conn.params.ConnPerRouteBean;
42 import org.apache.http.conn.routing.HttpRoute;
43 import org.apache.http.conn.scheme.SchemeRegistry;
44 import org.apache.http.impl.conn.DefaultClientConnectionOperator;
45 import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
46 import org.apache.http.impl.conn.SchemeRegistryFactory;
47 import org.apache.http.params.HttpParams;
48 import org.apache.http.util.Args;
49 import org.apache.http.util.Asserts;
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 @ThreadSafe
72 @Deprecated
73 public class ThreadSafeClientConnManager implements ClientConnectionManager {
74
75 private final Log log;
76
77
78 protected final SchemeRegistry schemeRegistry;
79
80 protected final AbstractConnPool connectionPool;
81
82
83 protected final ConnPoolByRoute pool;
84
85
86 protected final ClientConnectionOperator connOperator;
87
88 protected final ConnPerRouteBean connPerRoute;
89
90
91
92
93
94
95 public ThreadSafeClientConnManager(final SchemeRegistry schreg) {
96 this(schreg, -1, TimeUnit.MILLISECONDS);
97 }
98
99
100
101
102 public ThreadSafeClientConnManager() {
103 this(SchemeRegistryFactory.createDefault());
104 }
105
106
107
108
109
110
111
112
113
114
115 public ThreadSafeClientConnManager(final SchemeRegistry schreg,
116 final long connTTL, final TimeUnit connTTLTimeUnit) {
117 this(schreg, connTTL, connTTLTimeUnit, new ConnPerRouteBean());
118 }
119
120
121
122
123
124
125
126
127
128
129
130
131
132 public ThreadSafeClientConnManager(final SchemeRegistry schreg,
133 final long connTTL, final TimeUnit connTTLTimeUnit, final ConnPerRouteBean connPerRoute) {
134 super();
135 Args.notNull(schreg, "Scheme registry");
136 this.log = LogFactory.getLog(getClass());
137 this.schemeRegistry = schreg;
138 this.connPerRoute = connPerRoute;
139 this.connOperator = createConnectionOperator(schreg);
140 this.pool = createConnectionPool(connTTL, connTTLTimeUnit) ;
141 this.connectionPool = this.pool;
142 }
143
144
145
146
147
148
149
150
151
152 @Deprecated
153 public ThreadSafeClientConnManager(final HttpParams params,
154 final SchemeRegistry schreg) {
155 Args.notNull(schreg, "Scheme registry");
156 this.log = LogFactory.getLog(getClass());
157 this.schemeRegistry = schreg;
158 this.connPerRoute = new ConnPerRouteBean();
159 this.connOperator = createConnectionOperator(schreg);
160 this.pool = (ConnPoolByRoute) createConnectionPool(params) ;
161 this.connectionPool = this.pool;
162 }
163
164 @Override
165 protected void finalize() throws Throwable {
166 try {
167 shutdown();
168 } finally {
169 super.finalize();
170 }
171 }
172
173
174
175
176
177
178
179
180 @Deprecated
181 protected AbstractConnPool createConnectionPool(final HttpParams params) {
182 return new ConnPoolByRoute(connOperator, params);
183 }
184
185
186
187
188
189
190
191
192 protected ConnPoolByRoute createConnectionPool(final long connTTL, final TimeUnit connTTLTimeUnit) {
193 return new ConnPoolByRoute(connOperator, connPerRoute, 20, connTTL, connTTLTimeUnit);
194 }
195
196
197
198
199
200
201
202
203
204
205
206
207
208 protected ClientConnectionOperator
209 createConnectionOperator(final SchemeRegistry schreg) {
210
211 return new DefaultClientConnectionOperator(schreg);
212 }
213
214 public SchemeRegistry getSchemeRegistry() {
215 return this.schemeRegistry;
216 }
217
218 public ClientConnectionRequest requestConnection(
219 final HttpRoute route,
220 final Object state) {
221
222 final PoolEntryRequest poolRequest = pool.requestPoolEntry(
223 route, state);
224
225 return new ClientConnectionRequest() {
226
227 public void abortRequest() {
228 poolRequest.abortRequest();
229 }
230
231 public ManagedClientConnection getConnection(
232 final long timeout, final TimeUnit tunit) throws InterruptedException,
233 ConnectionPoolTimeoutException {
234 Args.notNull(route, "Route");
235
236 if (log.isDebugEnabled()) {
237 log.debug("Get connection: " + route + ", timeout = " + timeout);
238 }
239
240 final BasicPoolEntry entry = poolRequest.getPoolEntry(timeout, tunit);
241 return new BasicPooledConnAdapter(ThreadSafeClientConnManager.this, entry);
242 }
243
244 };
245
246 }
247
248 public void releaseConnection(final ManagedClientConnection conn, final long validDuration, final TimeUnit timeUnit) {
249 Args.check(conn instanceof BasicPooledConnAdapter, "Connection class mismatch, " +
250 "connection not obtained from this manager");
251 final BasicPooledConnAdapter hca = (BasicPooledConnAdapter) conn;
252 if (hca.getPoolEntry() != null) {
253 Asserts.check(hca.getManager() == this, "Connection not obtained from this manager");
254 }
255 synchronized (hca) {
256 final BasicPoolEntry entry = (BasicPoolEntry) hca.getPoolEntry();
257 if (entry == null) {
258 return;
259 }
260 try {
261
262 if (hca.isOpen() && !hca.isMarkedReusable()) {
263
264
265
266
267
268
269
270
271 hca.shutdown();
272 }
273 } catch (final IOException iox) {
274 if (log.isDebugEnabled()) {
275 log.debug("Exception shutting down released connection.",
276 iox);
277 }
278 } finally {
279 final boolean reusable = hca.isMarkedReusable();
280 if (log.isDebugEnabled()) {
281 if (reusable) {
282 log.debug("Released connection is reusable.");
283 } else {
284 log.debug("Released connection is not reusable.");
285 }
286 }
287 hca.detach();
288 pool.freeEntry(entry, reusable, validDuration, timeUnit);
289 }
290 }
291 }
292
293 public void shutdown() {
294 log.debug("Shutting down");
295 pool.shutdown();
296 }
297
298
299
300
301
302
303
304
305
306
307
308 public int getConnectionsInPool(final HttpRoute route) {
309 return pool.getConnectionsInPool(route);
310 }
311
312
313
314
315
316
317
318
319
320 public int getConnectionsInPool() {
321 return pool.getConnectionsInPool();
322 }
323
324 public void closeIdleConnections(final long idleTimeout, final TimeUnit tunit) {
325 if (log.isDebugEnabled()) {
326 log.debug("Closing connections idle longer than " + idleTimeout + " " + tunit);
327 }
328 pool.closeIdleConnections(idleTimeout, tunit);
329 }
330
331 public void closeExpiredConnections() {
332 log.debug("Closing expired connections");
333 pool.closeExpiredConnections();
334 }
335
336
337
338
339 public int getMaxTotal() {
340 return pool.getMaxTotalConnections();
341 }
342
343
344
345
346 public void setMaxTotal(final int max) {
347 pool.setMaxTotalConnections(max);
348 }
349
350
351
352
353 public int getDefaultMaxPerRoute() {
354 return connPerRoute.getDefaultMaxPerRoute();
355 }
356
357
358
359
360 public void setDefaultMaxPerRoute(final int max) {
361 connPerRoute.setDefaultMaxPerRoute(max);
362 }
363
364
365
366
367 public int getMaxForRoute(final HttpRoute route) {
368 return connPerRoute.getMaxForRoute(route);
369 }
370
371
372
373
374 public void setMaxForRoute(final HttpRoute route, final int max) {
375 connPerRoute.setMaxForRoute(route, max);
376 }
377
378 }
379