Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

HttpClientError: The target server failed to respond

I am trying to hit a server using HTTP client using PoolingClientConnectionManager setting max connections for individual hosts

//Code that initializes my connection manager and HTTP client 
HttpParams httpParam = httpclient.getParams();
HttpConnectionParams.setSoTimeout(httpParam, SOCKET_TIMEOUT);

HttpConnectionParams.setConnectionTimeout(httpParam, CONN_TIMEOUT);

httpclient.setParams(httpParam);

//Run a thread which closes Expired connections
new ConnectionManager(connManager).start(); 

//Code that executes my request 
HttpPost httpPost = new HttpPost(url);
        HttpEntity httpEntity = new StringEntity(request, "UTF-8");
httpPost.setEntity(httpEntity);

Header acceptEncoding = new BasicHeader("Accept-Encoding", "gzip,deflate");
httpPost.setHeader(acceptEncoding);     

if(contenttype != null && !contenttype.equals("")){
    Header contentType = new BasicHeader("Content-Type", contenttype);
    httpPost.setHeader(contentType);
}
InputStream inputStream = null;
LOG.info(dataSource + URL + url + REQUEST + request);

HttpResponse response = httpclient.execute(httpPost);

That is we are using Connection pooling for http persistence .

We are getting this error sporadically :

The target server failed to respond
org.apache.http.NoHttpResponseException: The target server failed to respond
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:95)
        at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:62)
        at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:254)
        at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:289)
        at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:252)
        at org.apache.http.impl.conn.ManagedClientConnectionImpl.receiveResponseHeader(ManagedClientConnectionImpl.java:191)
        at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:300)
        at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:127)
        at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:517)
        at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)

Does any one know how to resolve this?

We are shutting down idle connections as well.

Can some Please help.

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

like image 288
Balaji V Avatar asked Mar 17 '15 16:03

Balaji V


People also ask

What does NoHttpResponseException mean?

NoHttpResponseException means that the client didn't get a response, not that the server didn't get and/or processed the request.

What is closeable HTTP client?

CloseableHttpClient is the base class of the httpclient library, the one all implementations use. Other subclasses are for the most part deprecated. The HttpClient is an interface for this class and other classes. You should then use the CloseableHttpClient in your code, and create it using the HttpClientBuilder .

What is Apache HttpClient?

The Apache HttpClient library allows to handling HTTP requests. To use this library add a dependency to your Maven or Gradle build file. You find the latest version here: https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient. You retrieve and send data via the HttpClient class.


2 Answers

Probably, it is a bug in the HttpClient.

If you are using the HttpClient 4.4, please try to upgrade to 4.4.1.

If you want for more information, please look at this link.

If you can't upgrade, the following links might be helpful.

http://www.nuxeo.com/blog/using-httpclient-properly-avoid-closewait-tcp-connections/

Good luck!

like image 146
daimarom Avatar answered Oct 05 '22 06:10

daimarom


Recently faced similar while using HttpClient 5.

On enabling the HttpClient logs and found that the issue was due to stale connections.

Adding the below helped to solve the issue, it detects and validates the connections that have become stale while kept inactive in the pool before reuse.

PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();

connectionManager.setValidateAfterInactivity(timeinmilliseconds);
like image 33
RSingh Avatar answered Oct 05 '22 07:10

RSingh