Hmmmm, we have been using the same interface on both the server and client.
We publish an API jar (a separately-maintained artifact) for our callers to
use to talk to us and it makes interoperability a snap. This is using just
the CXF-specific stuff, but this AsyncRespone problem has plagued us, so I
was just curious if MP had solved it. If we could use CompletionStage<T> on
both the server and client, that’d be great. I’ve implemented that with a
MessageBodyWriter in the past, but wasn’t terribly happy with it. It
worked, but felt sort of “hacky”.

I’m also not a big fan of using Response objects as the return type, since
it doesn’t help folks understand what’s going on as much as strongly-typed
responses. Is that the suggested pattern to use for MP folks?
On Wed, Dec 26, 2018 at 4:56 PM Andy McCright <[email protected]>
wrote:

> Hi James,
>
> The client shouldn't know or care whether the service method is async or
> not - in fact, it shouldn't care whether the remote service is using JAX-RS
> or even Java at all.
>
> So whether you have a JAX-RS service method that looks like this:
> @Path("/mypath")
> public class MyResource {
>
>     @POST
>     @Path("sync")
>     public Response postSync(MyEntity entity) { // do something
> synchronously ... }
>
> //  or this:
>
>     @POST
>     @Path("async")
>     public void postAsync(@Suspended AsyncResponse ar, MyEntity entity) {
> // return something via async response ... }
> }
>
> your MP Rest Client interface should look like this:
>
> @Path("/mypath")
> public interface MyClient {
>
>     @POST
>     @Path("sync")
>     public Response postSync(MyEntity entity);
>
>     @POST
>     @Path("async")
>     public Response postAsync(MyEntity entity);
> }
>
> Notice that the return type is the same in both cases - and that the
> signature on the client methods do not include an AsyncResponse argument.
>
> Keep in mind that in both cases, only the server is running
> asynchronously.  The client will block for both methods.  IMO, this is less
> valuable than using async on the client.  I don't really see much point in
> using async on the server unless your thread pool for handling JAX-RS
> service methods is severely constrained.  But I think async on the client
> makes a lot more sense.  To do that, you would need to use MP Rest Client
> 1.1 (1.0 doesn't have async support), and then the client method should
> return an instance of CompletionStage.  So if you were to convert the
> client above to run async, it would look like this:
>
> @Path("/mypath")
> public interface MyClient {
>
>     @POST
>     @Path("sync")
>     public CompletionStage<Response> postSync(MyEntity entity);
>
>     @POST
>     @Path("async")
>     public CompletionStage<Response> postAsync(MyEntity entity);
> }
>
> Hope this helps,
>
> Andy
>
>
> On Sat, Dec 22, 2018 at 10:24 AM James Carman <[email protected]>
> wrote:
>
> > With the Microprofile client support, what happens if I have an async
> > service method (with @Suspended and what not)?  How would I call it using
> > the proxy object?
> >
>

Reply via email to