users@jax-rs-spec.java.net

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

From: Pavel Bucek <pavel.bucek_at_oracle.com>
Date: Fri, 13 Jan 2017 21:36:23 +0100

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