On Wed, 2011-02-16 at 16:31 +0200, Maxim Veksler wrote: > On Wed, Feb 16, 2011 at 3:14 PM, Oleg Kalnichevski <[email protected]> wrote: > > > > Once aborted a request cannot be executed again. Create a new HttpGet > > instance for each request execution. They are cheap. > > > > The problem is that HttpClient does not check whether or not a request > > has been aborted prior to trying to execute it. Feel free to raise a > > JIRA for this defect. > > > > Oleg > > > > I've implemented you comments and the execution has greatly improved. > The code is working :) > Please find code at > https://gist.github.com/829061/50faa10a99aea3315449e13b4eaf558469795778 > > Several things still bug me: > > 1. Why (as you can see from the attached below execution log) the code > runs cleanly from ~20seconds and only then starts very frequently to > throw ConnectionPoolTimeoutException ? Is this a problem on my end, > the network or the linux kernel. I would appreciate if someone could > download the HttpClientTest.java and run it to see if this behaviour > reproduces for him as well. In my setup I've ran this now for ~50 > times and in all cases the errors start after ~20seconds. >
'httpGet = null' in the catch clause never gets executed because HttpGet.abort() keeps throwing 'request already aborted' exception causing your thread to spin like crazy. Rewrite you code to use a local instance of HttpGet. > 2. Do I need to call httpGet.abort(); on the old object is I'm going > to create a new one on the next loop? (Please look at the code, it > much easier just to show the logic then try and explain it here in > text). > No, you do not. You will be MUCH better off simply closing the input stream in a finally clause, as shown here http://hc.apache.org/httpcomponents-client-ga/httpclient/examples/org/apache/http/examples/client/ClientConnectionRelease.java > 3. Is the code written correctly to reuse the connection, See example above. I would also recommend re-using the same HttpClient instance for all threads of execution. > I would like > to verify I'm send the GET events as quickly as possible - I will > always be talking to the same RoutePath and Hench would like to take > advantage of connection pooling. (After I get the buggy code to work > correctly I will obviously raise the MaxPerRoute and the > CONNECTION_TIMEOUT to reasonably values. > > 4. You say: > > Once aborted a request cannot be executed again. Create a new HttpGet > > instance for each request execution. They are cheap. > > What is considered resource intensive to create instances of? Is new > DefaultHttpClient(); costly? Quite. > Is new ThreadSafeClientConnManager(); > costly? > Very much. > 5. Please pay attention to my comment regarding the fact that my code > is mostly based on the http client official documentation, I think > it's worth updating it so that other people won't be confused. Would > you like me to file a JIRA for it? Is there a code repository for the > documentation, I would rather submit a patch. > http://svn.apache.org/repos/asf/httpcomponents/httpclient/trunk/src/docbkx/ We love patches ;-) Oleg --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
