kungfoo
kungfoo

Reputation: 1347

Why does HttpClient throw a SocketTimeOutException when executing POST

I have code similar to the following:

try {
    HttpPost post = new HttpPost(httpsUrl);
    setHeaders(post);

    HttpEntity entity = new StringEntity(request, "UTF-8");

    post.setEntity(entity);

    HttpResponse response = httpclient.execute(post);
    String result = EntityReader.readContent(response.getEntity());
    checkAnswer(result);
    return result;

} catch (Exception e) {
    throw new ZapException("Error executing the http post request: "+e.getMessage(), e);
}

It sends the content of request to a server via POST using a httpclient instance that might have already been used before (it has persistent connections turned on, since we're sending quite some requests to the same server...).

This sometimes fails with a SocketTimeoutException with "Read timed out" as the message. It's not clear to us, why it only fails at some times, when most times it doesn't. What gives?

Upvotes: 6

Views: 10647

Answers (1)

Abdull
Abdull

Reputation: 27832

In the following, I assume you are using Apache Commons HttpClient (org.apache.commons.httpclient.HttpClient).

Maybe you get thrown a SocketTimeoutException simply because, occasionally, the host your HttpClient instance is communicating with takes too long to respond, triggering HttpClient's cancellation routine. You can increase the connection timeout and the socket timeout with the following

HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(20000);
params.setSoTimeout(15000);

Aditionally, if you still face timeouts despite increasing the timeout limits, it is a good practice to handle the SocketTimeoutException gracefully - for example by retrying the connection a second and third time.

Upvotes: 4

Related Questions