Hello,

I have been facing issues with the HttpClient around resiliency to server-side 
failures.   My intention is that if my Http request isn't satisfied in some 
small amount of time (say 600ms), then HttpClient should give up.

I thought that I was achieving this by setting connectionTimeout in the 
RequestConfig.  Today we ran into a situation where we blocked indefinitely in 
httpClient.  I finally killed the server it was connecting to, and my 
HttpClient requesting code (below) finally throws an IOException.

 Our logging was empty until I killed the remote server.  Once it was down, the 
client logged:

10:36:15.712 [ServiceRunnerThread] INFO   o.a.http.impl.execchain.RetryExec - 
I/O exception (org.apache.http.NoHttpResponseException) caught when processing 
request to {}->http://remotehost:8888<http://remotehost:8888/>: The target 
server failed to respond
10:36:15.713 [ServiceRunnerThread] INFO   o.a.http.impl.execchain.RetryExec - 
Retrying request to {}->http://remotehost:8888<http://remotehost:8888/>
10:36:15.768 [ServiceRunnerThread] ERROR  c.i.g.s.b.o.m.DataService - Exception 
while attempting to connect to Remote Gateway: 
org.apache.http.conn.HttpHostConnectException: Connect to remote host:8888 
[remotehost/10.1.1.1] failed: Connection refused


Here is my request logic.  I am using httpclient-4.3.3:

        final HttpGet myRequest = new HttpGet(aUri);

        try {
            RequestConfig myRequestConfig = 
RequestConfig.custom().setConnectTimeout(CONNECTION_TIMEOUT).build();
            CloseableHttpClient myClient = HttpClientBuilder.create()
                    .setDefaultRequestConfig(myRequestConfig)
                    .build();
            final HttpResponse myResponse =  myClient.execute(myRequest);
            final HttpEntity myEntity = myResponse.getEntity();

            if (myEntity == null) {
                return null;
            }

            final String myContent = EntityUtils.toString(myEntity);
            if (ok(myResponse)) {
                return theObjectMapper.readValue(myContent, aClass);
            } else {
                LOGGER.error("{}", myContent);
                return null;
            }
        } finally {
            myRequest.releaseConnection();
        }


I am hoping this is a simple oversight in my construction of the HttpClient.


Any and all ideas/suggestions is greatly appreciated!

-Rob

________________________________

The information in this e-mail is intended only for the person or entity to 
which it is addressed.

It may contain confidential and /or privileged material. If someone other than 
the intended recipient should receive this e-mail, he / she shall not be 
entitled to read, disseminate, disclose or duplicate it.

If you receive this e-mail unintentionally, please inform us immediately by 
"reply" and then delete it from your system. Although this information has been 
compiled with great care, neither IMC Financial Markets & Asset Management nor 
any of its related entities shall accept any responsibility for any errors, 
omissions or other inaccuracies in this information or for the consequences 
thereof, nor shall it be bound in any way by the contents of this e-mail or its 
attachments. In the event of incomplete or incorrect transmission, please 
return the e-mail to the sender and permanently delete this message and any 
attachments.

Messages and attachments are scanned for all known viruses. Always scan 
attachments before opening them.

Reply via email to