On Tue, 2010-05-11 at 12:28 -0700, Ken Krugler wrote:
> On May 11, 2010, at 11:53am, Brooks, Kenneth S wrote:
> 
> > In the 4.0.1 tutorial I see the following paragraph.
> >
> > ... begin snippet ...
> > HttpClient tries to mitigate the problem by testing whether the  
> > connection is 'stale', that is no longer valid because it was closed  
> > on the server side, prior to using the connection for executing an  
> > HTTP request. The stale connection check is not 100% reliable and  
> > adds 10 to 30 ms overhead to each request execution. The only  
> > feasible solution that does not involve a one thread per socket  
> > model for idle connections is a dedicated monitor thread used to  
> > evict connections that are considered expired due to a long period  
> > of inactivity. The monitor thread can periodically call  
> > ClientConnectionManager#closeExpiredConnections() method to close  
> > all expired connections and evict closed connections from the pool.  
> > It can also optionally call  
> > ClientConnectionManager#closeIdleConnections() method to close all  
> > connections that have been idle over a given period of time.
> > ... end snippet ...
> >
> > Today we implement both the stale connection checking as well as the  
> > IdleConnectionTimeoutThread (in 3.1).
> > I would love to save the 10-30ms overhead but without doing that  
> > stale check it is possible that a connection was closed (that the  
> > Idle monitor may not have awoken to catch)..
> > Sounds like to me the only way to be as close to 100% safe is to  
> > implement both..
> >
> > Is that correct?
> 
> I don't believe so.
> 
> Assuming the connection is stale, then you'll get an exception when  
> you try to use it, so assuming you have a retry handler installed, you  
> can automatically retry that type of failure.
> 
> Some code from the Bixo project to illustrate:
> 
>              _httpClient = new DefaultHttpClient(cm, params);
>              _httpClient.setHttpRequestRetryHandler(new  
> MyRequestRetryHandler(MAX_RETRY_COUNT));
> 
> 
>      private static class MyRequestRetryHandler implements  
> HttpRequestRetryHandler {
>          private int _maxRetryCount;
> 
>          public MyRequestRetryHandler(int maxRetryCount) {
>              _maxRetryCount = maxRetryCount;
>          }
> 
>          @Override
>          public boolean retryRequest(IOException exception, int  
> executionCount, HttpContext context) {
>              if (LOGGER.isTraceEnabled()) {
>                  LOGGER.trace("Decide about retry #" + executionCount  
> + " for exception " + exception.getMessage());
>              }
> 
>              if (executionCount >= _maxRetryCount) {
>                  // Do not retry if over max retry count
>                  return false;
>              } else if (exception instanceof NoHttpResponseException) {
>                  // Retry if the server dropped connection on us
>                  return true;
>              } else if (exception instanceof SSLHandshakeException) {
>                  // Do not retry on SSL handshake exception
>                  return false;
>              }
> 
>              HttpRequest request =  
> (HttpRequest)context.getAttribute(ExecutionContext.HTTP_REQUEST);
>              boolean idempotent = !(request instanceof  
> HttpEntityEnclosingRequest);
>              // Retry if the request is considered idempotent
>              return idempotent;
>          }
>      }
> 

Yep, a retry handler is the way to go. 

Oleg

> 
> --------------------------------------------
> Ken Krugler
> +1 530-210-6378
> http://bixolabs.com
> e l a s t i c   w e b   m i n i n g
> 
> 
> 
> 



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to