What we do, is have the http callback handle the completed(), failed(),
cancelled() but immediately wrap the HttpResponse within a Runnable and
throw it over to an executor service to be handled. That way, the 2 threads
that async http uses to handle incoming responses are doing the minimum
amount of work.
Our config looks like
int timeout =
configuration.getAsyncConnectionTimeout();
int reactorThreadPoolSize = 16;
int maxConnectionsPerVendor = 10;
int maxConnections = 1024;
int numReaderThreads = 2;
if (configuration.getAsyncReactorThreadPoolSize() != null) {
reactorThreadPoolSize =
configuration.getAsyncReactorThreadPoolSize();
}
if (configuration.getAsyncMaxConnectionsPerVendor() !=
null) {
maxConnectionsPerVendor =
configuration.getAsyncMaxConnectionsPerVendor();
}
if (configuration.getAsyncMaxConnectionsAcrossAllVendors()
!= null) {
maxConnections =
configuration.getAsyncMaxConnectionsAcrossAllVendors();
}
if (configuration.getAsyncReaderThreadPoolSize() != null) {
numReaderThreads =
configuration.getAsyncReaderThreadPoolSize();
}
RequestConfig requestConfig;
if (context.isUseProxy()) {
requestConfig = RequestConfig.custom()
.setSocketTimeout(timeout)
.setProxy(new HttpHost(context.getProxyHost(),
context.getProxyPort()))
.setConnectTimeout(timeout)
.build();
}
else {
requestConfig = RequestConfig.custom()
.setSocketTimeout(timeout)
.setConnectTimeout(timeout)
.build();
}
ConnectionConfig connectionConfig =
ConnectionConfig.custom()
.setMalformedInputAction(CodingErrorAction.IGNORE)
.setUnmappableInputAction(CodingErrorAction.IGNORE)
.setCharset(Consts.UTF_8)
.build();
IOReactorConfig reactorConfig = IOReactorConfig.custom()
.setIoThreadCount(reactorThreadPoolSize)
.build();
CloseableHttpAsyncClient httpClient =
HttpAsyncClients.custom()
.setDefaultRequestConfig(requestConfig)
.setDefaultIOReactorConfig(reactorConfig)
.setDefaultConnectionConfig(connectionConfig)
.setMaxConnPerRoute(maxConnectionsPerVendor)
.setMaxConnTotal(maxConnections)
.build();
context.setHttpClient(httpClient);
context.setReaderService(Executors.newFixedThreadPool(numReaderThreads));
On Wed, Mar 4, 2015 at 10:55 AM, Paul Bear <[email protected]> wrote:
> Graeme, thanks for the example. I wonder what the number of threads is that
> process the responses ? Is it the number of Processors from Runtime class,
> is it configurable ?
>
> 2015-03-04 11:04 GMT+01:00 Graeme Wallace <[email protected]
> >:
>
> > Async Http package does what you are looking for.
> >
> > https://hc.apache.org/httpcomponents-asyncclient-dev/examples.html
> >
> > 3rd example down is where you want to start.
> >
> >
> > Graeme
> >
> > On Wed, Mar 4, 2015 at 9:54 AM, Paul Bear <[email protected]> wrote:
> >
> > > I have a large list of URLs (about 1 millon) and I want to run
> > >
> > > - one thread that runs through the list and asynchronously sends GET
> > > requests
> > > - several worker threads that process the responses
> > >
> > > Is it possible to separate sending GETs and processing responses in
> > > different threads using Apache Client ?
> > >
> > > Any ideas are welcome!
> > >
> >
> >
> >
> > --
> > Graeme Wallace
> > CTO
> > FareCompare.com
> > O: 972 588 1414
> > M: 214 681 9018
> >
>
--
Graeme Wallace
CTO
FareCompare.com
O: 972 588 1414
M: 214 681 9018