On Tue, 2010-08-17 at 12:18 -0700, Mike Boyers wrote:
> I've been a user of HttpClient 3 for several years and am now migrating to 
> using HttpClient 4.
> 
> With version 3, I wrapped (extended) the client in order to instrument it 
> (via JMX).  I kept track of the following pieces of information, per host:
> -Number of request (socket) timeouts
> -Number of connection timeouts
> -Number of timeouts while waiting for connection from pool
> -Total number of requests
> -Average Request duration
> -Maximum Request duration
> -Number of connections currently in pool
> -Max connections in pool
> 
> With HttpClient version 4, I'd rather not extend the client and would instead 
> like have developers use a pre-configured httpclient that was created with a 
> ThreadSafeClientConnManager.
> 
> I can see how to use a HttpRequestInterceptor and HttpResponseInterceptor
> to record things like number of transactions, request durations, etc.
> 
> What I need help with is determining how I can record timeout information.  
> When I'd recorded this in the past, I caught exceptions thrown by 
> HttpClient's execute method in my extended class.  It looks like when I call 
> execute on HttpClient 4, if an exception is thrown, the 
> HttpResponseInterceptor will not be called.  I'm not sure where to intercept 
> in this case.

HttpClient is an interface in 4.x, so instead of extending its default
implementation you should consider using the Decorator pattern in order
to introduce additional functionality.

> 
> Another related question: I typically have a scheduled task that occasionally 
> calls the connection manager's closeIdleConnections method.  After I do this, 
> when I want to learn how many connections are in each pool, I have to have 
> kept track of each HttpRoute and then call the getConnectionsInPool(route) 
> method for each route.  Is there a way I can have the connection manager give 
> me the list of routes so I don't have to keep track of them myself?
> 

Presently not. It should be fairly easy to add, though, as the
ConnPoolByRoute class maintains a map of unique routes internally.

> And one final question: I'd like to consider the possibility of handing out 
> an HttpClient that will not talk to any host unless it has been explicitly 
> configured (to force developers to think about the proper max pool size so we 
> fail fast when a remote source is having issues).  What I'm thinking is 
> something like:
>  ConnPerRouteBean connPerRoute = new ConnPerRouteBean(0);
> 
>  // Then explicitly enable hosts as follows
>  HttpHost localhost = new HttpHost("localhost", 8080);
>  localhostRoute = new HttpRoute(localhost);
>  connPerRoute.setMaxForRoute(localhostRoute, 10);
>  ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute);
> 
> But I currently get an exception when instantiating ConnPerRouteBean with 0 
> (needs to be a positive integer).  Is there a different way to accomplish 
> this other than the path I've outlined above?
> 

We have not thought of this kind of situation so currently there is not
way to prevent the pooling connection manager from creating connections
to a particular target host by setting the per route limit to zero. 

The only solution to the problem I can think of from the top of my head
is a custom connection manager that requires an explicit route
configuration before a connection for that particular route can be made.

Overall, I think you will be better off by developing a custom
connection manager given a fairly uncommon set of requirements that you
have.

Hope this helps

Oleg


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

Reply via email to