Make HttpComponentsAsyncClientHttpRequest abortable

This commit aborts the HttpComponentsAsyncClientHttpRequest whenever the
returned Future is canceled.

Issue: SPR-14845
(cherry picked from commit 8f84446)
This commit is contained in:
Arjen Poutsma
2016-10-28 14:18:46 +02:00
committed by Juergen Hoeller
parent edf1df33cc
commit b6b536682e
2 changed files with 19 additions and 2 deletions

View File

@@ -92,7 +92,7 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
entityEnclosingRequest.setEntity(requestEntity);
}
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback();
final HttpResponseFutureCallback callback = new HttpResponseFutureCallback(this.httpRequest);
final Future<HttpResponse> futureResponse =
this.httpClient.execute(this.httpRequest, this.httpContext, callback);
return new ClientHttpResponseFuture(futureResponse, callback);
@@ -101,9 +101,15 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
private static class HttpResponseFutureCallback implements FutureCallback<HttpResponse> {
private final HttpUriRequest httpRequest;
private final ListenableFutureCallbackRegistry<ClientHttpResponse> callbacks =
new ListenableFutureCallbackRegistry<ClientHttpResponse>();
public HttpResponseFutureCallback(HttpUriRequest httpRequest) {
this.httpRequest = httpRequest;
}
public void addCallback(ListenableFutureCallback<? super ClientHttpResponse> callback) {
this.callbacks.addCallback(callback);
}
@@ -128,6 +134,7 @@ final class HttpComponentsAsyncClientHttpRequest extends AbstractBufferingAsyncC
@Override
public void cancelled() {
this.httpRequest.abort();
}
}