Moshe Ben-Shoham wrote:
Hi,
The scenario is as follows: I'm doing two consecutive requests to the
same host, using a multi-threaded (or thread safe) connection pool
manager. The first invocation has a timeout of 10s and the second has a
timeout of 30s.
In version 3.1 of HttpClient all works well, but in 4.0 I get a timeout
exception in the second request, after ~10 seconds, which means the
first timeout is used.
Looking at the code, I see that in version 3.1, the
HttpMethodDirector.executeWithRetry() method invokes a method named
applyConnectionParams() that took care of setting the timeout taken from
the request on the socket.
But in version 4.0, the only place I see the timeout is set on the
socket is when DefaultRequestDirector.execute(HttpHost, HttpRequest,
HttpContext) opens a connection using the managedConn.open() method.
Since the connection is reused between the requests, the second request
uses a socket with a timeout of the first request. As a (bad)
workaround, I put on the HttpClient instance a ConnectionReuseStrategy
that always says no to reusing the connection, so a new connection is
created for the second request, with the required timeout.
Am I missing something?
Thanks,
Moshe.
Hi Moshe
This is definitely a bug. Please raise a JIRA for this issue:
https://issues.apache.org/jira/browse/HTTPCLIENT
As a somewhat cleaner workaround you can obtain the actual connection
from the execution context and reset the timeout on that connection.
This at least will work for the response body.
---
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet request = new HttpGet("http://www.google.com/");
HttpContext context = new BasicHttpContext();
HttpResponse rsp = httpclient.execute(request, context);
HttpClientConnection conn = (HttpClientConnection) context.getAttribute(
ExecutionContext.HTTP_CONNECTION);
conn.setSocketTimeout(1000);
HttpEntity entity = rsp.getEntity();
System.out.println("----------------------------------------");
System.out.println(rsp.getStatusLine());
System.out.println("----------------------------------------");
if (entity != null) {
entity.consumeContent();
}
---
Oleg
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]