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.nio.client;
28
29 import java.util.List;
30 import java.util.concurrent.Executors;
31 import java.util.concurrent.Future;
32 import java.util.concurrent.ThreadFactory;
33
34 import org.apache.commons.logging.Log;
35 import org.apache.commons.logging.LogFactory;
36 import org.apache.http.ConnectionReuseStrategy;
37 import org.apache.http.HttpHost;
38 import org.apache.http.client.protocol.HttpClientContext;
39 import org.apache.http.concurrent.BasicFuture;
40 import org.apache.http.concurrent.FutureCallback;
41 import org.apache.http.conn.ConnectionKeepAliveStrategy;
42 import org.apache.http.impl.DefaultConnectionReuseStrategy;
43 import org.apache.http.impl.client.DefaultConnectionKeepAliveStrategy;
44 import org.apache.http.nio.NHttpClientEventHandler;
45 import org.apache.http.nio.conn.NHttpClientConnectionManager;
46 import org.apache.http.nio.protocol.HttpAsyncRequestExecutor;
47 import org.apache.http.nio.protocol.HttpAsyncRequestProducer;
48 import org.apache.http.nio.protocol.HttpAsyncResponseConsumer;
49 import org.apache.http.protocol.BasicHttpContext;
50 import org.apache.http.protocol.HttpContext;
51 import org.apache.http.protocol.HttpProcessor;
52
53 class MinimalHttpAsyncClient extends CloseableHttpAsyncClientBase {
54
55 private final Log log = LogFactory.getLog(getClass());
56
57 private final NHttpClientConnectionManager connmgr;
58 private final HttpProcessor httpProcessor;
59 private final ConnectionReuseStrategy connReuseStrategy;
60 private final ConnectionKeepAliveStrategy keepaliveStrategy;
61
62 public MinimalHttpAsyncClient(
63 final NHttpClientConnectionManager connmgr,
64 final ThreadFactory threadFactory,
65 final NHttpClientEventHandler eventHandler,
66 final HttpProcessor httpProcessor,
67 final ConnectionReuseStrategy connReuseStrategy,
68 final ConnectionKeepAliveStrategy keepaliveStrategy) {
69 super(connmgr, threadFactory, eventHandler);
70 this.connmgr = connmgr;
71 this.httpProcessor = httpProcessor;
72 this.connReuseStrategy = connReuseStrategy;
73 this.keepaliveStrategy = keepaliveStrategy;
74 }
75
76 public MinimalHttpAsyncClient(
77 final NHttpClientConnectionManager connmgr,
78 final HttpProcessor httpProcessor) {
79 this(connmgr,
80 Executors.defaultThreadFactory(),
81 new HttpAsyncRequestExecutor(),
82 httpProcessor,
83 DefaultConnectionReuseStrategy.INSTANCE,
84 DefaultConnectionKeepAliveStrategy.INSTANCE);
85 }
86
87 @Override
88 public <T> Future<T> execute(
89 final HttpAsyncRequestProducer requestProducer,
90 final HttpAsyncResponseConsumer<T> responseConsumer,
91 final HttpContext context,
92 final FutureCallback<T> callback) {
93 ensureRunning();
94 final BasicFuture<T> future = new BasicFuture<T>(callback);
95 final HttpClientContext localcontext = HttpClientContext.adapt(
96 context != null ? context : new BasicHttpContext());
97
98 @SuppressWarnings("resource")
99 final MinimalClientExchangeHandlerImpl<T> handler = new MinimalClientExchangeHandlerImpl<T>(
100 this.log,
101 requestProducer,
102 responseConsumer,
103 localcontext,
104 future,
105 this.connmgr,
106 this.httpProcessor,
107 this.connReuseStrategy,
108 this.keepaliveStrategy);
109 try {
110 handler.start();
111 } catch (final Exception ex) {
112 handler.failed(ex);
113 }
114 return new FutureWrapper<T>(future, handler);
115 }
116
117 @Override
118 public <T> Future<List<T>> execute(
119 final HttpHost target,
120 final List<? extends HttpAsyncRequestProducer> requestProducers,
121 final List<? extends HttpAsyncResponseConsumer<T>> responseConsumers,
122 final HttpContext context,
123 final FutureCallback<List<T>> callback) {
124 ensureRunning();
125 final BasicFuture<List<T>> future = new BasicFuture<List<T>>(callback);
126 final HttpClientContext localcontext = HttpClientContext.adapt(
127 context != null ? context : new BasicHttpContext());
128 @SuppressWarnings("resource")
129 final PipeliningClientExchangeHandlerImpl<T> handler = new PipeliningClientExchangeHandlerImpl<T>(
130 this.log,
131 target,
132 requestProducers,
133 responseConsumers,
134 localcontext,
135 future,
136 this.connmgr,
137 this.httpProcessor,
138 this.connReuseStrategy,
139 this.keepaliveStrategy);
140 try {
141 handler.start();
142 } catch (final Exception ex) {
143 handler.failed(ex);
144 }
145 return new FutureWrapper<List<T>>(future, handler);
146 }
147
148 }