[
https://issues.apache.org/jira/browse/HTTPCLIENT-2281?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17736577#comment-17736577
]
Oleg Kalnichevski commented on HTTPCLIENT-2281:
-----------------------------------------------
[~bclozel] Is this a bug report or a question?
Oleg
> AsyncExecChain is not aware of cancellations
> --------------------------------------------
>
> Key: HTTPCLIENT-2281
> URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2281
> Project: HttpComponents HttpClient
> Issue Type: Bug
> Components: HttpClient (async)
> Affects Versions: 5.2.1
> Reporter: brian clozel
> Priority: Minor
>
> When working on a AsyncExecChain implementation, the "execute" method is tied
> to the lifecycle of the exchange through the AsyncExecCallback that is
> provided to the next element in the chain.
> It's not clear how the AsyncExecChain is supposed to be notified of
> cancellations and how it should clear resources. None of the
> AsyncExecCallback contracts are not called when a cancellation occurs.
> Given the following sample implementation, that allocates resources when the
> execution starts. The handler is not notified of cancellations and resources
> cannot be cleared as a result.
> {code:java}
> public class CustomHandler implements AsyncExecChainHandler {
> @Override
> public void execute(HttpRequest request, AsyncEntityProducer
> entityProducer, AsyncExecChain.Scope scope,
> AsyncExecChain chain, AsyncExecCallback asyncExecCallback) throws
> HttpException, IOException {
>
> CustomResource resource = CustomResource.allocate();
> chain.proceed(request, entityProducer, newScope, new
> AsyncExecCallback() {
> @Override
> public AsyncDataConsumer handleResponse(HttpResponse response,
> EntityDetails entityDetails)
> throws HttpException, IOException {
> // not called in case of cancellation
> resource.clear();
> return asyncExecCallback.handleResponse(response,
> entityDetails);
> }
> @Override
> public void handleInformationResponse(HttpResponse response)
> throws HttpException, IOException {
> // not called in case of cancellation
> asyncExecCallback.handleInformationResponse(response);
>
> }
> @Override
> public void completed() {
> // not called in case of cancellation
> resource.clear();
> asyncExecCallback.completed();
> }
> @Override
> public void failed(Exception cause) {
> // not called in case of cancellation
> resource.clear();
> asyncExecCallback.failed(cause);
> }
> });
> }
> {code}
> Here is a concrete sample using the custom handler:
> {code:java}
> CustomHandler customHandler = new CustomHandler();
> CloseableHttpAsyncClient client = HttpAsyncClients.custom()
> .addExecInterceptorFirst("custom", customHandler)
> .build();
> client.start();
> final SimpleHttpRequest request =
> SimpleRequestBuilder.get("http://localhost/delay/10").build();
> final Future<SimpleHttpResponse> future = client.execute(request,
> new FutureCallback<SimpleHttpResponse>() {
> @Override
> public void completed(final SimpleHttpResponse response) {
> }
> @Override
> public void failed(final Exception ex) {
> }
> @Override
> public void cancelled() {
> // this method is called but the custom handler is not made aware
> of cancellations
> System.out.println(request + " cancelled");
> }
> });
> future.cancel(true);
> {code}
> So far I have used the AsyncExecChain.Scope CancellableDependency and tried
> to wrap it to be notified of cancellations but I'm not sure this is the right
> choice.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]