users@jax-rs-spec.java.net

[jax-rs-spec users] Re: JAX-RS Client Reactive API review

From: Sergey Beryozkin <sberyozkin_at_talend.com>
Date: Mon, 16 Jan 2017 16:55:21 +0000

Hi Pavel

Looks like Invocation.Builder.rx() methods which accept
RxInvokerProvider are visible to these RxInvokerProviders.

This is problematic. I see Jersey RxInvokerProviders delegate back to
Invocation.Builder so I can appreciate why Invocation.Builder is passed on,

but it just does not look right to me that rx() and similarly, async()
bridges, are still visible to the providers.

Cheers, Sergey

On 13/01/17 20:36, Pavel Bucek wrote:
>
> Dear experts,
>
> please review following wiki and APIs:
>
> https://java.net/projects/jax-rs-spec/pages/RxClient
>
> All added classes related to Reactive Client APIs are linked from that
> page, but let me allow a short recap.
>
> JAX-RS Client is being extended by the ability to provide a way how to
> process responses in reactive fashion. The change consists of:
>
> - adding rx(...) methods to Invocation.Builder
> - defining RxInvoker
> - allowing users to extend this API by providing RxInvokerProvider
>
> Specification will mandate implementation for CompletionStage from
> Java SE 8.
>
> Client code examples:
>
> - basic use
>
> CompletionStage<List<String>> cs =
> client.target("remote/forecast/{destination}")
> .resolveTemplate("destination","mars")
> .request()
> .header("Rx-User","Java8")
> .rx()// gets CompletionStageRxInvoker .get(new GenericType<List<String>>() {
> });
>
> cs.thenAccept(System.out::println);
>
> - using custom RxInvokerFactory (this is little artificial, since the
> factory just returns CompletionStageRxInvoker, but support for
> Observable from RxJava or ListenableFuture from Guava can be done in
> the exact same manner)
>
> CompletionStage<List<String>> cs =
> client.target("remote/forecast/{destination}")
> .resolveTemplate("destination","mars")
> .request()
> .header("Rx-User","Java8")
> .rx(CompletionStageRxInvokerProvider.class)
> .get(new GenericType<List<String>>() {
> });
>
> cs.thenAccept(System.out::println);
>
>
> Source links:
>
> -
> https://github.com/jax-rs/api/blob/2.1-m02/jaxrs-api/src/main/java/javax/ws/rs/client/Invocation.java#L298
> -
> https://github.com/jax-rs/api/blob/2.1-m02/jaxrs-api/src/main/java/javax/ws/rs/client/RxInvoker.java
> -
> https://github.com/jax-rs/api/blob/2.1-m02/jaxrs-api/src/main/java/javax/ws/rs/client/RxInvokerProvider.java
>
> Examples & tests:
>
> -
> https://github.com/jax-rs/api/blob/2.1-m02/jaxrs-api/src/test/java/javax/ws/rs/core/RxClientTest.java
> -
> https://github.com/jersey/jersey/blob/2.x/core-client/src/test/java/org/glassfish/jersey/client/ClientRxTest.java#L86
>
> The last link is to the Jersey repository. Jersey version 2.26 will be
> JAX-RS 2.1 RI and branch 2.x is where the development will happen.
> Jersey 2.26-b01 (which is being released right now) implements all
> rx(...) methods; feel free to test/evaluate it there.
>
> Looking forward to your feedback!
>
> Thanks and regards,
> Pavel
>
>