Saksham created HTTPCORE-675:
--------------------------------

             Summary: CloseableHttpClient  leaving too many TIME_WAIT 
connections
                 Key: HTTPCORE-675
                 URL: https://issues.apache.org/jira/browse/HTTPCORE-675
             Project: HttpComponents HttpCore
          Issue Type: Bug
            Reporter: Saksham


We are using *CloseableHttpClient* with *PoolingHttpClientConnectionManager,*  
following is the configuration:
{code:java}
RequestConfig requestConfig = RequestConfig.custom()
                                           .setConnectTimeout(1000)
                                           .setConnectionRequestTimeout(1000)
                                           .setSocketTimeout(1000)
                                           .build();

PoolingHttpClientConnectionManager connectionManager = new 
PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(100);
connectionManager.setDefaultMaxPerRoute(100);

this.httpClient = HttpClients.custom()
                             .setDefaultRequestConfig(requestConfig)
                             .setConnectionManager(connectionManager)
                             .build();
{code}
 

Now when we are not consuming the response entity and just relying on 
closeableHttpResponse to release the resources, we end up with 25K connections 
in CLOSE_WAIT state with just over 400RPS to the system. Due this system runs 
out of resources very quickly and requests start failing.

Problem Snippet:
{code:java}
try (CloseableHttpResponse response = this.httpClient.execute(httpGet)){

    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
        return EntityUtils.toByteArray(response.getEntity());
    } else {
        if (response.getStatusLine().getStatusCode() >= 500) {
            throw new RemoteCallFailException();
        }
    }
} catch (IOException e) {
    logger.error("Remote db read request failed [{}]", e.getMessage(), e);
    throw new RemoteCallFailException();
}
{code}
After using *EntityUtils.consume(response.getEntity()) in the else block* of 
above code connections are properly getting released and reused in subsequent 
requests. 



Working Snippet:
{code:java}
try (CloseableHttpResponse response = this.httpClient.execute(httpGet)) {
    if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
        return EntityUtils.toByteArray(response.getEntity());
    } else {
        // Consuming stream to release connection
        EntityUtils.toByteArray(response.getEntity());
        if (response.getStatusLine().getStatusCode() >= 500) {
            throw new RemoteCallFailException();
        }
    }
} catch (IOException e) {
    logger.error("Remote db read request failed [{}]", e.getMessage(), e);
    throw new RemoteCallFailException();
}
{code}

Can someone please point why releasing of connection is not automatically done 
by closeablehttpResponse.close() ? ( Or maybe point to something wrong in the 
code)




MVN dependency used for same:

<dependency>
 <groupId>org.apache.httpcomponents</groupId>
 <artifactId>httpclient</artifactId>
 <version>4.3.3</version>
</dependency>

 



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to