jsr370-experts@jax-rs-spec.java.net

Re: Returning CompletionStage from a resource method

From: Sergey Beryozkin <sberyozkin_at_talend.com>
Date: Tue, 25 Apr 2017 21:28:42 +0100

AsyncResponse.cancel returns 503 with an optional Retry-After header

Canceling does not seem to qualify as a server error 500

Sergey
On 25/04/17 21:19, Markus KARG wrote:
> Throwing CancellationException sounds correct to me, and I think it would be a good idea to mandate that the fact of cancellation is mentioned in the error message when returning status 500.
>
> -Markus
>
> -----Original Message-----
> From: Pavel Bucek [mailto:pavel.bucek_at_oracle.com]
> Sent: Dienstag, 25. April 2017 09:56
> To: jsr370-experts_at_jax-rs-spec.java.net
> Subject: Returning CompletionStage from a resource method
>
> Dear experts,
>
> I was implementing support for returning CompletionStage from a resource method and I found some room for possible inconsistency:
>
> When returned CompletionStage is already done, we don't need to spawn another thread, we just use the same one. To be able to call "isDone", the implementation must convert CompletionStage to CompletableFuture (there is a method on the CompletionStage interface for that, so no issues so far).
>
> CompletableFuture has three terminal states:
>
> - completed,
> - completed exceptionally,
> - cancelled.
>
> When the state is completed, it is the same as when the resource method would return the type directly.
>
> When the state is completed exceptionally, it is the as when the resource method would thrown an exception.
>
> The question is what to do when the state is cancelled?
>
> My initial implementation throws IllegalStateException, but when looking to what is passed to CompletionStage.whenComplete, maybe the better way would be to throw CancellationException. (assuming that both, ISE or CE would be then processable by ExceptionMapper, if/when registered).
>
> Any ideas/opinions on which exception should be thrown?
>
> Thanks and regards,
> Pavel
>
>
> ps.: after seeing what I wrote, I convinced myself to use CancellationException - anyway, if anyone has other opinion, please share it.
>
>