Presentation is loading. Please wait.

Presentation is loading. Please wait.

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Think Async Masoud Kalali, Software Engineer, Embrace and.

Similar presentations


Presentation on theme: "Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Think Async Masoud Kalali, Software Engineer, Embrace and."— Presentation transcript:

1

2 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Think Async Masoud Kalali, Software Engineer, ORACLE, @MasoudKalal Embrace and Get Addicted to the Asynchronicity of Java SE and EE

3 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Safe Harbor Statement The following is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.

4 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Program Agenda Introduction Why to think Async A simple case of using Async JMS (2.0) Async Servlet Async JAX-RS Async EJBs 1 2 3 4 5 6 7

5 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Speakers Masoud Kalali Software engineer, author, blogger Long advocate of GlassFish and Java EE Tweets at @MasoudKalali

6 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Why to think Async? To better model what we develop for To further decouple – Ease of administration – Ease of tuning – Ease of maintenance Improve consumers experience – An API consumer – A direct GUI for human use – etc.

7 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE And ASynchronicity Long present JMS – To be used almost everywhere Servlet 3.0/ 3.1 – Asynchronous Servlets – None blocking IO JAX-RS 2.0 – Server side – Client side Asynchronous Session Beans – Server side – Client side

8 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | A simple asynchronous nourished use case Client Cache Query Processor JMS Queue Async Servlet MDB ID, AsyncContext Query Requests in JMS Chunks of Query results Consume result chunks and send it back via AsyncContext 1 12.13 2 4…. 5….6….7…. 8….

9 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | A simple asynchronous nourished use case One JMS queue for sending the query requests One JMS queue which will get chunks of query results An MDB which will consume the query result messages – Uses the cache and the id in the message to pick up the right AsyncContext – As long as the message does not say it is done it will not conclude the response Complete the response when JMS message implies More details of the Messaging components

10 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | A simple asynchronous nourished use case Asynchronous Servlet receiving the requests Caching the AsynContext and a query Id Sending the Query message to the JMS queue – Including the query Id Leave it to the MDB to update the response Have a AsyncListener to send proper response if timeouts More details of the Servlet components

11 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | A simple asynchronous nourished use case A browser Can be – A SSE client – A COMET, Long Polling request Some basics on the client side

12 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JMS (2.0) A brief overview

13 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JMS: A brief overview I Broker Message Queue – Producers – Consumers Topic – Publishers – Subscribers

14 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | JMS 2.0: A brief overview: Multiple Consumers Allowed on the Same Topic Subscription Delivery Delay Sending Messages Asynchronously – Send the message and get callback when it is acknowledged by broker JMSXDeliveryCount message property No longer optional Standard MDB Configuration Properties as part of @MessageDriven – destinationType – subscriptionDurability – acknowledgeMode – subscriptionName –...

15 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.0 Asynchronous servlet

16 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.0 Asynchronicity Why we want it – More throughput – Better architecture mapping How it works – @WebServlet.asyncSupported, async-supported in XML config! – AsyncContext – AsyncListener

17 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.0 Asynchronicity : AsyncContext Adding listeners Doing request dispatching Accessing ServletRequest Accessing ServletResponse Concluding the request/response Setting, getting timeouts

18 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.0 Asynchronicity : AsyncListener Get callback on important events on an async request processing onComplete(AsyncEvent asyncEvent) onError(AsyncEvent asyncEvent) onStartAsync(AsyncEvent asyncEvent) onTimeout(AsyncEvent asyncEvent)

19 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.0 Asynchronicity : A little bit of code @WebServlet(asyncSupported = true, value = ”/query-servlet") public class QueryServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String id=...; cache.put(id,request.startAsync()); sendQueryMessage(id, request); }

20 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.1 Non-blocking IO

21 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.1: Non-Blocking IO Why do we want it? How does it work? – ReadListener: To read inbound data when available – WriteListener: To write data when possible – Changes in ServletOutputStream isReady() setWriteListener(…) – Changes in ServletInputStream isFinished() isReady() setReadListener(…)

22 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.1: Non-Blocking IO: ReadListener To get callbacks on ServletInputStream events – onDataAvailable – OnAllDataRead – onError

23 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Servlet 3.1: Non-Blocking IO: WriteListener To get notified on ServletOutputStream events – onError – onWritePossible

24 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0 Why would we need it? How does it work? – @Asynchronous – ExecutionContext for programmatic decision to do or not to do async – AsyncResponse – @Suspended – CompletionCallback – ConnectionCallbck

25 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: Server-side I On the serverside: – @Asynchronous: Annotate a sub-resource as Asynchronous – AsyncResponse: Provides results an actions on the running request setting timeout registering callbacks resume, cancel suspended request processing updating the response – @Suspended: To inject a suspended AsyncResponse into a sub-resource parameter How to mark a resource as Asynchronous

26 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: Server-side simple code @Path("/api/query") public class MyResource { @Context private ExecutionContext ctx; @GET @Produce(“application/json”) @Asynchronous @Path(“api/matching-query”) public void prepMatchingQueryResult(@Suspended AsyncResponse ar, @QueryParam String p1… ) { executor.submit( new Runnable() { public void run() { JsonObject response = getQueryResult(p1…); ctx.resume(response); //container thread picks up and continue } }); ctx.suspend();// Suspend connection and return } … } Server Code:

27 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: client-side simple code Future future = client. target(“/api/query/matching- query”).queryParam(...).request().async().get(JsonObject.class); try { JsonObject queryResult = future.get(30, TimeUnit.SECONDS); } catch (TimeoutException ex) { // } Client-Side with future

28 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: client-side simple code Client-Side with callback Future future = client. target(“/api/query/matching-query”). queryParam(...).request().async().get(new InvocationCallback () { @Override public void completed(JsonObject response) { //Invocation happens and some response is back (404, 200, etc.) } @Override public void failed(Throwable throwable) { //Invocation fails (client side) } });

29 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: Server-side II Single method interface void onComplete(Throwable t) signal completion of serving a request CompletionCallback

30 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asyncronicity in JAX-RS 2.0: Server-side III Single method interface void onDisconnect(AsyncResponse disconnected) signals interruption in client connection before completion ConnectionCallback

31 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asynchronous And long running jobs in REST Multi-step long running jobs not suitable with JAX-RS Async Send 202 where response is not ready with Location header – Intelligent enough client can query the resource Location with the given Retry-After header Don’t keep unnecessary resources for where not needed!

32 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | EJB 3.1 Asynchronicity in Session Beans

33 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asynchronicity in EJB 3.1 Works on session beans – fire and forget – Using Future to decide on completion AsyncResult as container specific vehicle – Passes the result to Future As simple as using @Asynchronous on method/bean Method should return Future Client can poll the future for Completion

34 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asynchronicity in EJB 3.1: Simple code sample @Stateless public class QueryProcessor { @Asynchronous public Future processQuery(QueryCrit crit){ try{ QueryResult result= prepQueryResult(crit); return new AsyncResult(result); }catch(Exception e){ //handle return new AsyncResult(FAILURE_RESULT); } }} Server-side code

35 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Asynchronicity in EJB 3.1: Simple code sample @Inject QueryProcessor queryProcessor; private JsonObject prepareQueryResult(String... params){ QueryCrit crit = new QueryCrit(params) Future result=queryProcessor.prepQueryResult(crit); //poll the Future.. There is no callback here... } cliet-side code

36 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Java EE 7 and SSE Asynchronicity in SSE

37 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Server-Sent Events  HTML 5 component  Client subscribe to event source  Unidirectional channel between server and client  Events can be streamed from server to client when happens  Connection stays open  event handling on client side  onMessage  onError  etc.  Subscription resuming

38 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Server-Sent Events  Can be developed using a plain Servlet  use the right media type  use the correct message format  Jersey provides support not JAX-RS yet  Server side to turn a JAX-RS endpoint to SSE broadcaster  Client side to subscribe and consume SS events

39 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Comments, Questions?

40 Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | RESTful Services Patterns and best practices By Bhakti Mehta Bhakti’s blog: https://www.java.net/blog/bhaktimehtahttps://www.java.net/blog/bhaktimehta Book’s sample codes: CCL photos used in slides: https://www.flickr.com/photos/treehouse1977/2892417805/ https://www.flickr.com/photos/essjay/165928100/ https://www.flickr.com/photos/jforth/4413370462/ https://www.flickr.com/photos/sakalak/8737872379/ https://www.flickr.com/photos/jbparrott/8980026600 https://www.flickr.com/photos/pentadact/36593493/ https://www.flickr.com/photos/jasohill/4442279347/ https://www.flickr.com/photos/mdsharpe/5075953655 https://www.flickr.com/photos/chuqvr/8329512894/ Resources

41


Download ppt "Copyright © 2014, Oracle and/or its affiliates. All rights reserved. | Think Async Masoud Kalali, Software Engineer, Embrace and."

Similar presentations


Ads by Google