Thanks very much, Oleg. I'll give that a shot!
On Fri, Apr 13, 2012 at 2:07 PM, Oleg Kalnichevski <[email protected]> wrote:
> On Thu, 2012-04-12 at 21:40 -0400, Dan Checkoway wrote:
> > Hello,
> >
> > I'm a long-time very happy user of HttpClient. I have bumped into what I
> > believe is a bug...but it's possible I'm just abusing the API and missing
> > something simple. :-)
> >
> > I use ThreadSafeClientConnManager and a single shared instance of
> > DefaultHttpClient to manage a persistent HTTP connection pool. It works
> > exactly as I need it to -- except it's not obeying timeouts.
> >
> > What I need to do is set an arbitrary timeout for each individual
> request.
> > That is, I can't just set one timeout up front when I create the
> > HttpClient. The timeout I need to use varies from request to request.
> >
> > The way I'm *trying* to convey the timeout is by setting attributes on
> the
> > HttpContext as shown in the code below...but what I'm experiencing is
> that
> > my timeouts are being ignored.
> >
> > I believe the root of the problem is that AbstractHttpClient is using its
> > determineParams() method, but that's completely disregarding the params
> > which may have been set on the context.
> >
> > Can you let me know if (a) this is a bug and I'm doing things correctly
> on
> > my end, or (b) there's another proper way to convey desired SO_TIMEOUT
> > and/or connect timeout on a per-request basis?
> >
> > Thanks!
> >
>
> Dan
>
> The HTTP context is intended for sharing mutable runtime data. What you
> want is to set HTTP parameters at the request level by using
> HttpUriRequest#getParams()
>
> Hope this helps
>
> Oleg
>
>
> > public class HttpTimeoutExample {
> > private ThreadSafeClientConnManager connMgr;
> > private HttpClient httpClient;
> >
> > public HttpTimeoutBugExample(int connTtlMs, int maxTotal, int
> > defaultMaxPerRoute) {
> > this.defaultConnectionTimeout = defaultConnectionTimeout;
> > this.defaultSoTimeout = defaultSoTimeout;
> >
> > connMgr = new
> > ThreadSafeClientConnManager(SchemeRegistryFactory.createDefault(),
> > connTtlMs, TimeUnit.MILLISECONDS);
> > connMgr.setMaxTotal(maxTotal);
> > connMgr.setDefaultMaxPerRoute(defaultMaxPerRoute);
> >
> > httpClient = new DefaultHttpClient(connMgr);
> > }
> >
> > public void doGetWithTimeout(String someUrl, boolean handleRedirects,
> > int timeLimitMs) {
> > HttpUriRequest httpRequest = new HttpGet(someUrl);
> >
> > BasicHttpContext httpContext = new BasicHttpContext();
> > httpContext.setAttribute(ClientPNames.HANDLE_REDIRECTS,
> > Boolean.valueOf(handleRedirects));
> >
> > // Set timeouts...these are being ignored!
> > httpContext.setAttribute(CoreConnectionPNames.CONNECTION_TIMEOUT,
> > Integer.valueOf(timeLimitMs));
> > httpContext.setAttribute(CoreConnectionPNames.SO_TIMEOUT,
> > Integer.valueOf(timeLimitMs));
> >
> > HttpResponse httpResponse = httpClient.execute(httpRequest,
> > httpContext);
> > HttpEntity httpEntity = httpResponse.getEntity();
> > try {
> > // read the response entity
> > } finally {
> > EntityUtils.consume(httpEntity);
> > }
> > }
> > }
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>