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]

Reply via email to