think async

41

Upload: tashya-mckay

Post on 02-Jan-2016

67 views

Category:

Documents


2 download

DESCRIPTION

Think Async. Embrace and Get Addicted to the Asynchronicity of Java SE and EE. Masoud Kalali, Software Engineer, ORACLE, @ MasoudKalal. Program Agenda. 1. 2. 3. 4. 5. 6. 7. Introduction Why to think Async A simple case of using Async JMS (2.0) Async Servlet Async JAX-RS - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Think  Async
Page 2: Think  Async

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

Page 3: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Safe Harbor StatementThe 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.

Page 4: Think  Async

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

Page 5: Think  Async

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

Page 6: Think  Async

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.

Page 7: Think  Async

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

Page 8: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

A simple asynchronous nourished use case

Client

Cache

Query

Processor

JMS

Queue

JMS

Queue

Async Servlet

MD

B

ID, AsyncContext

Query Requests in JMS

Chunks of Query resultsConsume result chunks and send it back via AsyncContext1

1 2.1 3

2

4….

5….6….7….

8….

Page 9: Think  Async

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

Page 10: Think  Async

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

Page 11: Think  Async

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

Page 12: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

JMS (2.0)A brief overview

Page 13: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

JMS: A brief overview I• Broker• Message• Queue– Producers– Consumers

• Topic– Publishers – Subscribers

Page 14: Think  Async

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– ...

Page 15: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Servlet 3.0Asynchronous servlet

Page 16: Think  Async

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

Page 17: Think  Async

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

Page 18: Think  Async

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)

Page 19: Think  Async

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); }}

Page 20: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Servlet 3.1Non-blocking IO

Page 21: Think  Async

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(…)

Page 22: Think  Async

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

Page 23: Think  Async

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

Page 24: Think  Async

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

Page 25: Think  Async

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

Page 26: Think  Async

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:

Page 27: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Asyncronicity in JAX-RS 2.0: client-side simple code

Future<JsonObject> 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

Page 28: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Asyncronicity in JAX-RS 2.0: client-side simple codeClient-Side with callbackFuture<JsonObject> future = client. target(“/api/query/matching-query”).

queryParam(...).request().async().get(new InvocationCallback<JsonObject>() {

@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)

}

});

Page 29: Think  Async

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

Page 30: Think  Async

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

Page 31: Think  Async

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!

Page 32: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

EJB 3.1Asynchronicity in Session Beans

Page 33: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Asynchronicity in EJB 3.1• Works on session beans– fire and forget– Using Future<V> to decide on completion

• AsyncResult as container specific vehicle– Passes the result to Future<V>

• As simple as using @Asynchronous on method/bean• Method should return Future<V>• Client can poll the future for Completion

Page 34: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Asynchronicity in EJB 3.1: Simple code sample

@Statelesspublic class QueryProcessor { @Asynchronous public Future<QueryResult> processQuery(QueryCrit crit){ try{

QueryResult result= prepQueryResult(crit); return new AsyncResult(result);

}catch(Exception e){ //handle

return new AsyncResult(FAILURE_RESULT); } }}

Server-side code

Page 35: Think  Async

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<QueryResult> result=queryProcessor.prepQueryResult(crit); //poll the Future.. There is no callback here... }}

cliet-side code

Page 36: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Java EE 7 and SSEAsynchronicity in SSE

Page 37: Think  Async

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

Page 38: Think  Async

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

Page 39: Think  Async

Copyright © 2014, Oracle and/or its affiliates. All rights reserved. |

Comments, Questions?

Page 40: Think  Async

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/bhaktimehta• Book’s sample codes:• CCL photos used in slides:

• https://www.flickr.com/photos/treehouse1977/2892417805/• 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

Page 41: Think  Async