You are viewing a plain text version of this content. The canonical link for it is here.
Posted to httpclient-users@hc.apache.org by Jose Dillet <jo...@gmail.com> on 2014/03/05 13:57:03 UTC

Pending requests not cancelled when async client is closed (http async client 4.0.1)

I have observed some differences between httpasyncclient 4.0-beta3 and
4.0.1 when the client is closed / shutdown and there are still pending
requests.
This can be observed by running AsyncClientHttpExchange and closing the
client while the request is not yet completed.

a) httpasyncclient-4.0-beta3.jar, httpclient-4.2.3.jar, httpcore-4.2.3.jar,
uses DefaultHttpAsyncClient implementation:
HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
httpclient.start();
final HttpGet request = new HttpGet("http://www.apache.org/");
Future<HttpResponse> future = httpclient.execute(request, myCallback);
httpclient.shutdown();    // maybe done by some other thread
HttpResponse response = future.get();

b) httpasyncclient-4.0.1.jar, httpclient-4.3.2.jar, httpcore-4.3.2.jar,
uses InternalHttpAsyncClient implementation:
CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
httpclient.start();
final HttpGet request = new HttpGet("http://www.apache.org/");
Future<HttpResponse> future = httpclient.execute(request, myCallback);
httpclient.close();      // maybe done by some other thread
HttpResponse response = future.get();

Generally it makes no sense to close the client in the same thread before
getting the response, but that might happen in our application on a
different thread.

In case a) cancelled is invoked on myCallback. In case b) cancelled is not
invoked, and the request hangs in future.get()

Is this change in the behavior expected, a bug or just some not documented
behavior in a corner case?

Regards,
Jose

Re: Pending requests not cancelled when async client is closed (http async client 4.0.1)

Posted by Oleg Kalnichevski <ol...@apache.org>.
On Wed, 2014-03-05 at 14:57 +0200, Jose Dillet wrote:
> I have observed some differences between httpasyncclient 4.0-beta3 and
> 4.0.1 when the client is closed / shutdown and there are still pending
> requests.
> This can be observed by running AsyncClientHttpExchange and closing the
> client while the request is not yet completed.
> 
> a) httpasyncclient-4.0-beta3.jar, httpclient-4.2.3.jar, httpcore-4.2.3.jar,
> uses DefaultHttpAsyncClient implementation:
> HttpAsyncClient httpclient = new DefaultHttpAsyncClient();
> httpclient.start();
> final HttpGet request = new HttpGet("http://www.apache.org/");
> Future<HttpResponse> future = httpclient.execute(request, myCallback);
> httpclient.shutdown();    // maybe done by some other thread
> HttpResponse response = future.get();
> 
> b) httpasyncclient-4.0.1.jar, httpclient-4.3.2.jar, httpcore-4.3.2.jar,
> uses InternalHttpAsyncClient implementation:
> CloseableHttpAsyncClient httpclient = HttpAsyncClients.createDefault();
> httpclient.start();
> final HttpGet request = new HttpGet("http://www.apache.org/");
> Future<HttpResponse> future = httpclient.execute(request, myCallback);
> httpclient.close();      // maybe done by some other thread
> HttpResponse response = future.get();
> 
> Generally it makes no sense to close the client in the same thread before
> getting the response, but that might happen in our application on a
> different thread.
> 
> In case a) cancelled is invoked on myCallback. In case b) cancelled is not
> invoked, and the request hangs in future.get()
> 
> Is this change in the behavior expected, a bug or just some not documented
> behavior in a corner case?
> 

Jose

It was a conscious decision to remove this feature from 4.0 GA. Keeping
track of all pending requests required a non-trivial amount of code and
a non-negligible performance overhead due to having to maintain an extra
queue with synchronized access. I was not sure it was worth it for what
was essentially a fringe case.

We could re-visit this issue for 4.1, though.

Oleg



---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscribe@hc.apache.org
For additional commands, e-mail: httpclient-users-help@hc.apache.org