hc-httpclient-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Oleg Kalnichevski <ol...@apache.org>
Subject Re: SO_TIMEOUT on a request level
Date Sun, 25 Oct 2009 13:47:21 GMT
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: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org


Mime
View raw message