On Wed, Feb 16, 2011 at 12:48 PM, sebb <[email protected]> wrote: > On 16 February 2011 10:41, Maxim Veksler <[email protected]> wrote: >> On Tue, Feb 15, 2011 at 3:06 PM, Oleg Kalnichevski <[email protected]> wrote: >>> >>> Well, I finally spotted an obvious problem with your code, which I >>> should have found earlier: HttpRequest objects are NOT thread-safe. They >>> may not be used by multiple threads. >>> >>> Oleg >>> >> >> Hi Oleg, >> >> By HttpRequest you mean HttpClient? > > No, I'm pretty sure he means HttpRequest. > >> If so then I believe it's a documentation bug because the code is >> mostly based on this sample: >> http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html#d4e650. >> Also it's perhaps wise to document that fact that the class is not >> thread safe in the javadoc's. >> >> I've shared my test code https://gist.github.com/829061, could you >> perhaps run it on your machine? It's and eclipse project with >> m2eclipse support configured. >> >> As for the code, I've made the modifications but the behavior remains: > > The code still shares a single HttpGet instance. > > Please fix that and try again. >
I've implemented the suggested changes. Please find them at the revision https://gist.github.com/829061/8a173df84ce47b288f6b34f675fc708fcf649535 This has improved the execution, now calling httpGet.abort(); does not affect the other running threads. Now the only problem I see is that the connection is not being "renewed" for the failing threads. I've placed a break point at "System.out.println("Breakpoint position");" The log of the run is attached below, what's interesting is that Thread-4 continued to run even after the abort was called (In the previous version, calling abort() would cancel the connection for all of the threads.) The execution log: Starting thread execution: Wed Feb 16 14:26:22 IST 2011 Thread-1: Exception Wed Feb 16 14:26:46 IST 2011 did a total of 11504 get requests org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-1: Abort Wed Feb 16 14:26:46 IST 2011 Thread-2: Exception Wed Feb 16 14:26:47 IST 2011 did a total of 12450 get requests org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:26:47 IST 2011 Thread-3: Exception Wed Feb 16 14:27:00 IST 2011 did a total of 19555 get requests org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417) at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300) at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:391) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-3: Abort Wed Feb 16 14:27:00 IST 2011 // Remove the break point, Release Thread-1 (F8) Breakpoint position java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Exception Wed Feb 16 14:34:48 IST 2011 did a total of 276595 get requests Thread-2: Abort Wed Feb 16 14:34:48 IST 2011 Breakpoint position Thread-2: Exception Wed Feb 16 14:34:48 IST 2011 did a total of 276708 get requests java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:34:48 IST 2011 Breakpoint position java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Exception Wed Feb 16 14:34:48 IST 2011 did a total of 276833 get requests Thread-2: Abort Wed Feb 16 14:34:48 IST 2011 Breakpoint position java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Exception Wed Feb 16 14:34:48 IST 2011 did a total of 276953 get requests Thread-2: Abort Wed Feb 16 14:34:49 IST 2011 Breakpoint position java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) Thread-2: Exception Wed Feb 16 14:34:49 IST 2011 did a total of 277063 get requests at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:34:49 IST 2011 Breakpoint position Thread-2: Exception Wed Feb 16 14:34:49 IST 2011 did a total of 277187 get requests java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:34:49 IST 2011 Breakpoint position Thread-2: Exception Wed Feb 16 14:34:49 IST 2011 did a total of 277297 get requests java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:34:49 IST 2011 Breakpoint position Thread-2: Exception Wed Feb 16 14:34:49 IST 2011 did a total of 277421 get requests java.io.IOException: Request already aborted at org.apache.http.client.methods.HttpRequestBase.setConnectionRequest(HttpRequestBase.java:110) at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:387) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) at HTTPClientTest$GetThread.run(HTTPClientTest.java:74) Thread-2: Abort Wed Feb 16 14:34:49 IST 2011 Thread-1: Exception Wed Feb 16 14:26:46 IST 2011 did a total of 11504 get requests --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
