SlideShare ist ein Scribd-Unternehmen logo
1 von 39
Downloaden Sie, um offline zu lesen
Others Talk,
We Listen.
Reactive Java EE -
Let Me Count the
Ways!
Reza Rahman
Senior Architect
rrahman@captechconsulting.com
@reza_rahman
CapTech
Full-service US national IT consulting firm that focuses on client best interests,
trust, servant leadership, culture, professionalism and technical excellence.
#28 in Vault's Consulting Top 50
#3 Best Consulting Internship
#9 Best Overall Internship
#1 in Meeting Client’s Needs
#7 Best Firm to Work For
#1 in Career Development
Ranked for the
7th
Consecutive Year
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Agenda
• What Exactly is Reactive?
• Touring Reactive in Java EE
• Bearable Reactive with Java SE 8?
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
What’s in a Name?
• “Reactive” fairly old but incredibly vague term
• A big hurdle to broad adoption by average developers
• Sound core principals co-opted by marketing concerns?
• Event/message driven
• Asynchronous
• Non-blocking
• Overloaded concerns to simple core principals attempted to be added on
more recently
• Responsive, resilient/fault-tolerant, elastic/adaptive, scalable, etc
• These are important concerns not that unique to Reactive techniques
• Long met by Java EE at the runtime level
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
What’s the Big Deal?
• Reactive has always been an important software engineering technique
• More responsive user experience
• High throughput, optimal hardware/CPU/IO utilization
• Loose coupling, complex event processing
• Will potentially become more important
• Internet of Things (IoT), device-to-device communication
• Mobile, large global concurrent user bases, more chatty applications
• Not necessarily a panacea
• Asynchronous, event driven code is always harder to write, maintain than
synchronous, blocking code
• Horizontal/hardware scalability can be a cheaper/more maintainable
answer
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Reactive Java EE
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
JMSJMS EJB 3EJB 3
Message-Driven
Beans
Message-Driven
Beans
Asynchronous
Session Beans
Asynchronous
Session Beans
CDICDI
EventsEvents
ObserversObservers
ServletServlet
AsynchronousAsynchronous
NIONIO
JAX-RSJAX-RS
Async on ServerAsync on Server
Async on ClientAsync on Client
WebSocketWebSocket
Async Remote
Endpoints
Async Remote
Endpoints
Concurrency
Utilities
Concurrency
Utilities
JMS and Message Driven Beans
• JMS one of the oldest APIs in Java EE, strongly aligned with Reactive
techniques
• Message/event driven, asynchronous
• Loosely coupled, reliable, transactional, durable, fault tolerant, error
tolerant, clustered
• Message Driven Beans primary vehicle for JMS message handling
• Just POJOs with annotations
• Transactional, thread-safe, throttled, reliable, load-balanced, fault-
tolerant, error-tolerant
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
JMS Send
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Inject JMSContext jmsContext;
@Resource(lookup = "jms/HandlingEventRegistrationAttemptQueue")
Destination handlingEventQueue;
...
public void receivedHandlingEventRegistrationAttempt(
HandlingEventRegistrationAttempt attempt) {
...
jmsContext.createProducer()
.setDeliveryMode(DeliveryMode.PERSISTENT) // The default :-)
.setPriority(LOW_PRIORITY)
.setDisableMessageID(true)
.setDisableMessageTimestamp(true)
.setStringProperty("source", source)
.send(handlingEventQueue, attempt);
}
Message Driven Bean
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@MessageDriven(activationConfig = {
@ActivationConfigProperty(propertyName = "destinationType",
propertyValue = "javax.jms.Queue"),
@ActivationConfigProperty(propertyName = "destinationLookup",
propertyValue = "jms/HandlingEventRegistrationAttemptQueue"),
@ActivationConfigProperty(propertyName = "messageSelector",
propertyValue = "source = 'mobile'")})
public class HandlingEventRegistrationAttemptConsumer
implements MessageListener {
...
public void onMessage(Message message) {
...
HandlingEventRegistrationAttempt attempt
= message.getBody(HandlingEventRegistrationAttempt.class);
...
}
}
Great Possibilities for JMS 2.1
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@ApplicationScoped
@MaxConcurrency(10)
public class HandlingEventRegistrationAttemptConsumer {
@JmsListener(
destinationLookup="jms/HandlingEventRegistrationAttemptQueue",
selector="source = 'mobile'",
batchSize=10, retry=5, retryDelay=7000,
orderBy=TIMESTAMP)
public void onEventRegistrationAttempt(
HandlingEventRegistrationAttempt... attempts) {
...
}
}
Asynchronous Session Beans
• Dead simple asynchrony at the component level
• Just an annotation on a POJO
• Great when all that is required is greater throughput or responsiveness
• Still transactional, thread-safe, throttled
• Not loosely coupled, persistent, fault tolerant or error tolerant (client must
explicitly handle errors)
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Asynchronous Session Bean
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Asynchronous
public void processPayment(Payment payment) {
// CPU/IO heavy tasks to process a payment
}
@Asynchronous
public Future<Report> generateReport(ReportParameters params) {
try {
Report report = renderReport(params);
return new AsyncResult(report);
} catch(ReportGenerationException e) {
return new AsyncResult(new ErrorReport(e));
}
Asynchronous Session Bean Client
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Inject ReportGeneratorService reportGeneratorService;
...
Future<Report> future =
reportGeneratorService.generateReport(parameters);
...
if (future.isDone()) {
Report report = future.get();
...
}
...
future.cancel(true);
@Asynchronous + CompletableFuture
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Asynchronous
public CompletableFuture<Confirmation> processPayment(Order order) {
...
Confirmation status = ...;
return
CompletableFuture<Confirmation>.completedFuture(status);
}
paymentService
.processPayment(order)
.thenAccept(
confirmation -> System.out.println(confirmation));
CDI Events/Observers
• Compact, simple, elegant, type-safe events
• Essentially the observer pattern formalized via a DI framework and
annotations
• Offers excellent solution to loose-coupling, type-safe filtering/chaining and
asynchrony (but not much else)
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
CDI Events
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Inject @CargoInspected Event<Cargo> cargoInspected;
...
public void inspectCargo(TrackingId trackingId) {
...
cargoInspected.fire(cargo);
}
public void onCargoInspected(
@Observes @CargoInspected Cargo cargo) {
@Qualifier
@Retention(RUNTIME) @Target({FIELD, PARAMETER})
public @interface CargoInspected {}
Asynchronous CDI Events
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Inject @CargoInspected Event<Cargo> cargoInspected;
...
public void inspectCargo(TrackingId trackingId) {
...
cargoInspected.fireAsync(cargo);
}
public void onCargoInspected(
@Observes(async=true) @CargoInspected Cargo cargo) {
Asynchronous Servlets and NIO
• Asynchronous Servlets maximize throughput/thread utilization
• Decouple connection from request thread
• Return request thread back to pool
• Handle IO/CPU heavy work on separate backend thread
• Close cached connection when done
• NIO removes possible thread blocks during slow read/write
• Get notified when the IO channel might be ready
• Only read/write when IO channel is ready
• Obvious need when Servlet IO is particularly heavy, otherwise a complex
solution
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Asynchronous Servlet
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@WebServlet(urlPatterns={"/report"}, asyncSupported=true)
public class AsyncServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) {
...
final AsyncContext asyncContext = request.startAsync();
asyncContext.start(() -> {
ReportParameters parameters =
parseReportParameters(asyncContext.getRequest());
Report report = generateReport(parameters);
printReport(report, asyncContext);
asyncContext.complete();
});
}
}
Asynchronous Servlet NIO (Output Stream)
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
private void printReport(Report report, AsyncContext context) {
ServletOutputStream output =
context.getResponse().getOutputStream();
WriteListener writeListener = new ReportWriteListener(
output, report, context);
output.setWriteListener(writeListener);
}
Asynchronous Servlet NIO (Write Listener)
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
class ReportWriteListener implements WriteListener {
private ServletOutputStream output = null;
private InputStream input = null;
private AsyncContext context = null;
ReportWriteListener(ServletOutputStream output, Report report,
AsyncContext context) {
this.output = output;
this.input = report.asPdfStream();
this.context = context;
}
...
Asynchronous Servlet NIO (Write Listener)
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
...
public void onWritePossible() throws IOException {
byte[] chunk = new byte[256];
int read = 0;
while (output.isReady() && (read = input.read(chunk)) != -1)
output.write(chunk, 0, read);
if (read == -1)
context.complete();
}
public void onError(Throwable t) {
context.complete();
t.printStackTrace();
}
}
Asynchronous JAX-RS
• Asynchronous capabilities newly added to JAX-RS 2/Java EE 7
• Both on the server and client side
• Server-side essentially identical to Servlet 3 async
• Nicer declarative syntax
• Client API async capabilities very symmetric to synchronous API
• Both Futures and callbacks supported
• JAX-RS server-side NIO promised for Java EE 8
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Asynchronous JAX-RS Resource
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Stateless
@Path("/reports")
public class ReportsResource {
...
@Path("{id}")
@GET
@Produces({"application/pdf"})
@Asynchronous
public void generateReport(
@PathParam("id") Long id,
@Suspended AsyncResponse response) {
ResponseBuilder builder = Response.ok(renderReport(id));
builder.header("Content-Disposition",
"attachment; filename=report.pdf");
response.resume(builder.build());
}
}
Asynchronous JAX-RS Client
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
WebTarget target = client.target("http://.../balance")...
Future<Double> future = target.request()
.async().get(Double.class));
...
Double balance = future.get();
WebTarget target = client.target("http://.../balance")...
target.request().async().get(
new InvocationCallback<Double>() {
public void complete(Double balance) {
// Process balance
}
public void failed(InvocationException e) {
// Process error
}
});
Asynchrony/NIO in WebSocket
• WebSocket endpoints are inherently asynchronous/event-driven
• No thread-connection association in the first place
• True for server and client side
• Writes/sends can be made asynchronous for better throughput
• Very symmetric API for both sync and async
• Futures or callbacks supported
• Good idea to use asynchronous send in most cases
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Asynchronous Remote WebSocket Endpoint
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Singleton @ServerEndpoint(value = "/chat"...)
public class ChatServer {
...
@OnOpen
public void onOpen(Session peer) {
peers.add(peer);
}
@OnClose
public void onClose(Session peer) {
peers.remove(peer);
}
@OnMessage
public void onMessage(ChatMessage message) {
for (Session peer : peers) {
...peer.getAsyncRemote().sendObject(message)...
}
}
}
Java EE Concurrency Utilities
• Allows for lower-level threading/asynchronous capabilities in Java EE in a
safe, reliable, managed fashion
• Very specialized code, custom workloads
• Fairly small extension of Java SE Concurrency Utilities
• ManagedExecutorService
• ManagedThreadFactory
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Managed Executor Service
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
@Path("/reports")
public class ReportsResource {
@Resource ManagedExecutorService executor;
...
@Path("{id}")
@GET
@Produces({"application/pdf"})
public void generateReport(
@PathParam("id") Long id,
@Suspended AsyncResponse response) {
executor.execute(() -> {
ResponseBuilder builder = Response.ok(renderReport(id));
builder.header("Content-Disposition",
"attachment; filename=report.pdf");
response.resume(builder.build());
}
}
}
Completable Future
• Futures and callbacks both have serious flaws
• Especially when it comes to significantly Reactive code
• Java SE 8 CompletableFuture significantly better for Reactive programming
• Non-blocking, event-driven, composable and functional (via lambdas)
• Easy to integrate with Java EE 7 managed executors
• Java EE 8 should embrace CompletableFuture uniformly
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Looks are Deceiving…
Person p = ...
Assets assets = getAssets(p);
Liabilities liabilities = getLiabilities(p);
Credit credit = calculateCreditScore(assets, liabilities);
History history = getHealthHistory(p);
Health health = calculateHeathScore(history);
Coverage coverage = underwrite(credit, health);
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
The Problem with Futures (and Callbacks)
Person p = ...
Future<Assets> f1 = executor.submit(() -> getAssets(p));
Future<Liabilities> f2 = executor.submit(
() -> getLiabilities(p));
Future<Credit> f3 = executor.submit(
() -> calculateCreditScore(f1.get(), f2.get()));
// The unrelated calls below are now blocked for no reason
Future<History> f4 = executor.submit(() -> getHealthHistory(p));
Future<Health> f5 = executor.submit(
() -> calculateHeathScore(f4.get()));
// Unrelated paths join below
Future<Coverage> f6 = executor.submit(
() -> underwrite(f3.get(), f5.get()));
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Callbacks don’t block, but introduce callback hell…
https://github.com/m-reza-rahman/reactive_javaee/blob/master/CallbackHell.java
CompletableFuture Basics
public CompletableFuture<Confirmation> processPayment(
Order order) {
CompletableFuture<Confirmation> future =
new CompletableFuture<>();
executor.execute(() -> {
Confirmation status = ...
future.complete(status);
});
return future;
}
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
paymentService
.processPayment(order)
.thenAccept(
confirmation -> System.out.println(confirmation));
Functional Reactive to the Rescue?
CompletableFuture<Assets> getAssets =
CompletableFuture.supplyAsync(() -> getAssets(person));
CompletableFuture<Liabilities> getLiabilities =
CompletableFuture.supplyAsync(() -> getLiabilities(person));
CompletableFuture<Credit> calculateCreditScore =
getAssets.thenCombineAsync(getLiabilities,
(assets, liabilities) ->
calculateCreditScore(assets, liabilities));
CompletableFuture<Health> calculateHeathScore =
CompletableFuture.supplyAsync(() -> getHealthHistory(person))
.thenApplyAsync(history -> calculateHeathScore(history));
Coverage coverage =
calculateCreditScore.thenCombineAsync(calculateHeathScore,
(credit, health) -> underwrite(credit, health)).join();
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
More Possibilities
• Reactive JPA
• Last major reactive frontier for Java EE
• Async/NIO support in underlying database driver/JDBC/Java SE
prerequisite
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
CompletableFuture<List<Country>> countries =
em.createQuery("SELECT c FROM Country c", Country.class)
.async().getResultList();
• Reactive MVC
• Similar to basic model in JAX-RS
• Reactive JSF conceptually tough
• Reactive streams
Java EE Guardians
http://javaee-guardians.io
@javaee_guardian
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Summary
• Reactive programming well established technique, may be more important in
the future
• Java EE has long had rich support for Reactive techniques
• Things should be improved even more with Java EE 8
• Java SE 8 helps quite a bit to make the programming model easier
• Beyond Java EE application servers provide clustering, load-balancing,
replication, failover, bandwidth throttling, resource pooling, thread pooling,
caching, etc
• Be careful – Reactive is not an easy approach to take
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Resources
• Java EE Tutorials
• http://docs.oracle.com/javaee/7/tutorial/doc/home.htm
• Java SE Tutorials
• http://docs.oracle.com/javase/tutorial/
• Digging Deeper
• http://docs.oracle.com/javaee/7/firstcup/doc/home.htm
• https://glassfish.java.net/hol/
• http://cargotracker.java.net
• Java EE Transparent Expert Groups
• http://javaee-spec.java.net
• Java EE Reference Implementation
• http://glassfish.org
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
Copyright © 2015 CapTech Ventures, Inc. All rights reserved.

Más contenido relacionado

Was ist angesagt?

Java EE 8: On the Horizon
Java EE 8:  On the HorizonJava EE 8:  On the Horizon
Java EE 8: On the HorizonJosh Juneau
 
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishBatch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishArun Gupta
 
Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7Hirofumi Iwasaki
 
GlassFish BOF
GlassFish BOFGlassFish BOF
GlassFish BOFglassfish
 
EJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and StrategyEJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and StrategyDavid Delabassee
 
JavaOne 2014 BOF4241 What's Next for JSF?
JavaOne 2014 BOF4241 What's Next for JSF?JavaOne 2014 BOF4241 What's Next for JSF?
JavaOne 2014 BOF4241 What's Next for JSF?Edward Burns
 
Java API for WebSocket 1.0: Java EE 7 and GlassFish
Java API for WebSocket 1.0: Java EE 7 and GlassFishJava API for WebSocket 1.0: Java EE 7 and GlassFish
Java API for WebSocket 1.0: Java EE 7 and GlassFishArun Gupta
 
Best Way to Write SQL in Java
Best Way to Write SQL in JavaBest Way to Write SQL in Java
Best Way to Write SQL in JavaGerger
 
Java EE 6 Adoption in One of the World’s Largest Online Financial Systems
Java EE 6 Adoption in One of the World’s Largest Online Financial SystemsJava EE 6 Adoption in One of the World’s Largest Online Financial Systems
Java EE 6 Adoption in One of the World’s Largest Online Financial SystemsArshal Ameen
 
Down-to-Earth Microservices with Java EE
Down-to-Earth Microservices with Java EEDown-to-Earth Microservices with Java EE
Down-to-Earth Microservices with Java EEReza Rahman
 
Modern web application development with java ee 7
Modern web application development with java ee 7Modern web application development with java ee 7
Modern web application development with java ee 7Shekhar Gulati
 
WebSocket in Enterprise Applications 2015
WebSocket in Enterprise Applications 2015WebSocket in Enterprise Applications 2015
WebSocket in Enterprise Applications 2015Pavel Bucek
 
Testing Java EE Applications Using Arquillian
Testing Java EE Applications Using ArquillianTesting Java EE Applications Using Arquillian
Testing Java EE Applications Using ArquillianReza Rahman
 
JavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchJavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchReza Rahman
 
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0David Delabassee
 

Was ist angesagt? (16)

Java EE 8: On the Horizon
Java EE 8:  On the HorizonJava EE 8:  On the Horizon
Java EE 8: On the Horizon
 
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFishBatch Applications for Java Platform 1.0: Java EE 7 and GlassFish
Batch Applications for Java Platform 1.0: Java EE 7 and GlassFish
 
Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7Seven Points for Applying Java EE 7
Seven Points for Applying Java EE 7
 
Move from J2EE to Java EE
Move from J2EE to Java EEMove from J2EE to Java EE
Move from J2EE to Java EE
 
GlassFish BOF
GlassFish BOFGlassFish BOF
GlassFish BOF
 
EJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and StrategyEJB and CDI - Alignment and Strategy
EJB and CDI - Alignment and Strategy
 
JavaOne 2014 BOF4241 What's Next for JSF?
JavaOne 2014 BOF4241 What's Next for JSF?JavaOne 2014 BOF4241 What's Next for JSF?
JavaOne 2014 BOF4241 What's Next for JSF?
 
Java API for WebSocket 1.0: Java EE 7 and GlassFish
Java API for WebSocket 1.0: Java EE 7 and GlassFishJava API for WebSocket 1.0: Java EE 7 and GlassFish
Java API for WebSocket 1.0: Java EE 7 and GlassFish
 
Best Way to Write SQL in Java
Best Way to Write SQL in JavaBest Way to Write SQL in Java
Best Way to Write SQL in Java
 
Java EE 6 Adoption in One of the World’s Largest Online Financial Systems
Java EE 6 Adoption in One of the World’s Largest Online Financial SystemsJava EE 6 Adoption in One of the World’s Largest Online Financial Systems
Java EE 6 Adoption in One of the World’s Largest Online Financial Systems
 
Down-to-Earth Microservices with Java EE
Down-to-Earth Microservices with Java EEDown-to-Earth Microservices with Java EE
Down-to-Earth Microservices with Java EE
 
Modern web application development with java ee 7
Modern web application development with java ee 7Modern web application development with java ee 7
Modern web application development with java ee 7
 
WebSocket in Enterprise Applications 2015
WebSocket in Enterprise Applications 2015WebSocket in Enterprise Applications 2015
WebSocket in Enterprise Applications 2015
 
Testing Java EE Applications Using Arquillian
Testing Java EE Applications Using ArquillianTesting Java EE Applications Using Arquillian
Testing Java EE Applications Using Arquillian
 
JavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great MatchJavaScript Frameworks and Java EE – A Great Match
JavaScript Frameworks and Java EE – A Great Match
 
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
Java EE 8 Adopt a JSR : JSON-P 1.1 & MVC 1.0
 

Ähnlich wie Reactive Java EE - Let Me Count the Ways!

Understanding and Developing Web Services - For DBAs and Developers
Understanding and Developing Web Services - For DBAs and DevelopersUnderstanding and Developing Web Services - For DBAs and Developers
Understanding and Developing Web Services - For DBAs and DevelopersRevelation Technologies
 
What Every Client Should Do on Their Oracle SOA Projects
What Every Client Should Do on Their Oracle SOA ProjectsWhat Every Client Should Do on Their Oracle SOA Projects
What Every Client Should Do on Their Oracle SOA ProjectsRevelation Technologies
 
Java EE7 in action
Java EE7 in actionJava EE7 in action
Java EE7 in actionAnkara JUG
 
Understanding and Developing Web Services: For DBAs and Database Developers
Understanding and Developing Web Services: For DBAs and Database DevelopersUnderstanding and Developing Web Services: For DBAs and Database Developers
Understanding and Developing Web Services: For DBAs and Database DevelopersRevelation Technologies
 
Java EE Introduction Course
Java EE Introduction CourseJava EE Introduction Course
Java EE Introduction CourseGanesh P
 
Real World Problem Solving Using Application Performance Management 10
Real World Problem Solving Using Application Performance Management 10Real World Problem Solving Using Application Performance Management 10
Real World Problem Solving Using Application Performance Management 10CA Technologies
 
Consuming Java EE in Desktop, Web, and Mobile Frontends
Consuming Java EE in Desktop, Web, and Mobile FrontendsConsuming Java EE in Desktop, Web, and Mobile Frontends
Consuming Java EE in Desktop, Web, and Mobile FrontendsGeertjan Wielenga
 
Kranky Geek WebRTC 2015 - Optimizing the customer experience
Kranky Geek WebRTC 2015 - Optimizing the customer experienceKranky Geek WebRTC 2015 - Optimizing the customer experience
Kranky Geek WebRTC 2015 - Optimizing the customer experienceKranky Geek
 
Servlet 4.0 Adopt-a-JSR 10 Minute Infodeck
Servlet 4.0 Adopt-a-JSR 10 Minute InfodeckServlet 4.0 Adopt-a-JSR 10 Minute Infodeck
Servlet 4.0 Adopt-a-JSR 10 Minute InfodeckEdward Burns
 
Greenplum Database Open Source December 2015
Greenplum Database Open Source December 2015Greenplum Database Open Source December 2015
Greenplum Database Open Source December 2015PivotalOpenSourceHub
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of ReactiveVMware Tanzu
 
Oracle WebLogic Server: Remote Monitoring and Management
Oracle WebLogic Server: Remote Monitoring and ManagementOracle WebLogic Server: Remote Monitoring and Management
Oracle WebLogic Server: Remote Monitoring and ManagementRevelation Technologies
 
Pivotal microservices spring_pcf_skillsmatter.pptx
Pivotal microservices spring_pcf_skillsmatter.pptxPivotal microservices spring_pcf_skillsmatter.pptx
Pivotal microservices spring_pcf_skillsmatter.pptxSufyaan Kazi
 
To Microservices and Beyond
To Microservices and BeyondTo Microservices and Beyond
To Microservices and BeyondMatt Stine
 

Ähnlich wie Reactive Java EE - Let Me Count the Ways! (20)

Node.js Workshop
Node.js WorkshopNode.js Workshop
Node.js Workshop
 
Understanding and Developing Web Services - For DBAs and Developers
Understanding and Developing Web Services - For DBAs and DevelopersUnderstanding and Developing Web Services - For DBAs and Developers
Understanding and Developing Web Services - For DBAs and Developers
 
What Every Client Should Do on Their Oracle SOA Projects
What Every Client Should Do on Their Oracle SOA ProjectsWhat Every Client Should Do on Their Oracle SOA Projects
What Every Client Should Do on Their Oracle SOA Projects
 
JAX-RS.next
JAX-RS.nextJAX-RS.next
JAX-RS.next
 
Java EE7 in action
Java EE7 in actionJava EE7 in action
Java EE7 in action
 
Understanding and Developing Web Services: For DBAs and Database Developers
Understanding and Developing Web Services: For DBAs and Database DevelopersUnderstanding and Developing Web Services: For DBAs and Database Developers
Understanding and Developing Web Services: For DBAs and Database Developers
 
Java EE Introduction Course
Java EE Introduction CourseJava EE Introduction Course
Java EE Introduction Course
 
Real World Problem Solving Using Application Performance Management 10
Real World Problem Solving Using Application Performance Management 10Real World Problem Solving Using Application Performance Management 10
Real World Problem Solving Using Application Performance Management 10
 
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
JavaCro'14 - Consuming Java EE Backends in Desktop, Web, and Mobile Frontends...
 
Consuming Java EE in Desktop, Web, and Mobile Frontends
Consuming Java EE in Desktop, Web, and Mobile FrontendsConsuming Java EE in Desktop, Web, and Mobile Frontends
Consuming Java EE in Desktop, Web, and Mobile Frontends
 
Kranky Geek WebRTC 2015 - Optimizing the customer experience
Kranky Geek WebRTC 2015 - Optimizing the customer experienceKranky Geek WebRTC 2015 - Optimizing the customer experience
Kranky Geek WebRTC 2015 - Optimizing the customer experience
 
Servlet 4.0 Adopt-a-JSR 10 Minute Infodeck
Servlet 4.0 Adopt-a-JSR 10 Minute InfodeckServlet 4.0 Adopt-a-JSR 10 Minute Infodeck
Servlet 4.0 Adopt-a-JSR 10 Minute Infodeck
 
Avinash_Aug_2015
Avinash_Aug_2015Avinash_Aug_2015
Avinash_Aug_2015
 
Greenplum Database Open Source December 2015
Greenplum Database Open Source December 2015Greenplum Database Open Source December 2015
Greenplum Database Open Source December 2015
 
The value of reactive
The value of reactiveThe value of reactive
The value of reactive
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of Reactive
 
Oracle WebLogic Server: Remote Monitoring and Management
Oracle WebLogic Server: Remote Monitoring and ManagementOracle WebLogic Server: Remote Monitoring and Management
Oracle WebLogic Server: Remote Monitoring and Management
 
Pivotal microservices spring_pcf_skillsmatter.pptx
Pivotal microservices spring_pcf_skillsmatter.pptxPivotal microservices spring_pcf_skillsmatter.pptx
Pivotal microservices spring_pcf_skillsmatter.pptx
 
To Microservices and Beyond
To Microservices and BeyondTo Microservices and Beyond
To Microservices and Beyond
 
Intel-altoweb-caseStudy
Intel-altoweb-caseStudyIntel-altoweb-caseStudy
Intel-altoweb-caseStudy
 

Último

Novo Nordisk's journey in developing an open-source application on Neo4j
Novo Nordisk's journey in developing an open-source application on Neo4jNovo Nordisk's journey in developing an open-source application on Neo4j
Novo Nordisk's journey in developing an open-source application on Neo4jNeo4j
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightSafe Software
 
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfQ4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfTejal81
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc
 
UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2DianaGray10
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3DianaGray10
 
March Patch Tuesday
March Patch TuesdayMarch Patch Tuesday
March Patch TuesdayIvanti
 
Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.IPLOOK Networks
 
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxGraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxNeo4j
 
Keep Your Finger on the Pulse of Your Building's Performance with IES Live
Keep Your Finger on the Pulse of Your Building's Performance with IES LiveKeep Your Finger on the Pulse of Your Building's Performance with IES Live
Keep Your Finger on the Pulse of Your Building's Performance with IES LiveIES VE
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTopCSSGallery
 
Where developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingWhere developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingFrancesco Corti
 
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Alkin Tezuysal
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfCheryl Hung
 
AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024Brian Pichman
 
Oracle Database 23c Security New Features.pptx
Oracle Database 23c Security New Features.pptxOracle Database 23c Security New Features.pptx
Oracle Database 23c Security New Features.pptxSatishbabu Gunukula
 
20140402 - Smart house demo kit
20140402 - Smart house demo kit20140402 - Smart house demo kit
20140402 - Smart house demo kitJamie (Taka) Wang
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarThousandEyes
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Muhammad Tiham Siddiqui
 
My key hands-on projects in Quantum, and QAI
My key hands-on projects in Quantum, and QAIMy key hands-on projects in Quantum, and QAI
My key hands-on projects in Quantum, and QAIVijayananda Mohire
 

Último (20)

Novo Nordisk's journey in developing an open-source application on Neo4j
Novo Nordisk's journey in developing an open-source application on Neo4jNovo Nordisk's journey in developing an open-source application on Neo4j
Novo Nordisk's journey in developing an open-source application on Neo4j
 
The Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and InsightThe Zero-ETL Approach: Enhancing Data Agility and Insight
The Zero-ETL Approach: Enhancing Data Agility and Insight
 
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdfQ4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
Q4 2023 Quarterly Investor Presentation - FINAL - v1.pdf
 
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie WorldTrustArc Webinar - How to Live in a Post Third-Party Cookie World
TrustArc Webinar - How to Live in a Post Third-Party Cookie World
 
UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2UiPath Studio Web workshop series - Day 2
UiPath Studio Web workshop series - Day 2
 
UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3UiPath Studio Web workshop Series - Day 3
UiPath Studio Web workshop Series - Day 3
 
March Patch Tuesday
March Patch TuesdayMarch Patch Tuesday
March Patch Tuesday
 
Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.Introduction - IPLOOK NETWORKS CO., LTD.
Introduction - IPLOOK NETWORKS CO., LTD.
 
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptxGraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
GraphSummit Copenhagen 2024 - Neo4j Vision and Roadmap.pptx
 
Keep Your Finger on the Pulse of Your Building's Performance with IES Live
Keep Your Finger on the Pulse of Your Building's Performance with IES LiveKeep Your Finger on the Pulse of Your Building's Performance with IES Live
Keep Your Finger on the Pulse of Your Building's Performance with IES Live
 
Top 10 Squarespace Development Companies
Top 10 Squarespace Development CompaniesTop 10 Squarespace Development Companies
Top 10 Squarespace Development Companies
 
Where developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is goingWhere developers are challenged, what developers want and where DevEx is going
Where developers are challenged, what developers want and where DevEx is going
 
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
Design and Modeling for MySQL SCALE 21X Pasadena, CA Mar 2024
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024AI Workshops at Computers In Libraries 2024
AI Workshops at Computers In Libraries 2024
 
Oracle Database 23c Security New Features.pptx
Oracle Database 23c Security New Features.pptxOracle Database 23c Security New Features.pptx
Oracle Database 23c Security New Features.pptx
 
20140402 - Smart house demo kit
20140402 - Smart house demo kit20140402 - Smart house demo kit
20140402 - Smart house demo kit
 
EMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? WebinarEMEA What is ThousandEyes? Webinar
EMEA What is ThousandEyes? Webinar
 
Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)Trailblazer Community - Flows Workshop (Session 2)
Trailblazer Community - Flows Workshop (Session 2)
 
My key hands-on projects in Quantum, and QAI
My key hands-on projects in Quantum, and QAIMy key hands-on projects in Quantum, and QAI
My key hands-on projects in Quantum, and QAI
 

Reactive Java EE - Let Me Count the Ways!

  • 1. Others Talk, We Listen. Reactive Java EE - Let Me Count the Ways! Reza Rahman Senior Architect rrahman@captechconsulting.com @reza_rahman
  • 2. CapTech Full-service US national IT consulting firm that focuses on client best interests, trust, servant leadership, culture, professionalism and technical excellence. #28 in Vault's Consulting Top 50 #3 Best Consulting Internship #9 Best Overall Internship #1 in Meeting Client’s Needs #7 Best Firm to Work For #1 in Career Development Ranked for the 7th Consecutive Year Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 3. Agenda • What Exactly is Reactive? • Touring Reactive in Java EE • Bearable Reactive with Java SE 8? Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 4. What’s in a Name? • “Reactive” fairly old but incredibly vague term • A big hurdle to broad adoption by average developers • Sound core principals co-opted by marketing concerns? • Event/message driven • Asynchronous • Non-blocking • Overloaded concerns to simple core principals attempted to be added on more recently • Responsive, resilient/fault-tolerant, elastic/adaptive, scalable, etc • These are important concerns not that unique to Reactive techniques • Long met by Java EE at the runtime level Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 5. What’s the Big Deal? • Reactive has always been an important software engineering technique • More responsive user experience • High throughput, optimal hardware/CPU/IO utilization • Loose coupling, complex event processing • Will potentially become more important • Internet of Things (IoT), device-to-device communication • Mobile, large global concurrent user bases, more chatty applications • Not necessarily a panacea • Asynchronous, event driven code is always harder to write, maintain than synchronous, blocking code • Horizontal/hardware scalability can be a cheaper/more maintainable answer Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 6. Reactive Java EE Copyright © 2015 CapTech Ventures, Inc. All rights reserved. JMSJMS EJB 3EJB 3 Message-Driven Beans Message-Driven Beans Asynchronous Session Beans Asynchronous Session Beans CDICDI EventsEvents ObserversObservers ServletServlet AsynchronousAsynchronous NIONIO JAX-RSJAX-RS Async on ServerAsync on Server Async on ClientAsync on Client WebSocketWebSocket Async Remote Endpoints Async Remote Endpoints Concurrency Utilities Concurrency Utilities
  • 7. JMS and Message Driven Beans • JMS one of the oldest APIs in Java EE, strongly aligned with Reactive techniques • Message/event driven, asynchronous • Loosely coupled, reliable, transactional, durable, fault tolerant, error tolerant, clustered • Message Driven Beans primary vehicle for JMS message handling • Just POJOs with annotations • Transactional, thread-safe, throttled, reliable, load-balanced, fault- tolerant, error-tolerant Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 8. JMS Send Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Inject JMSContext jmsContext; @Resource(lookup = "jms/HandlingEventRegistrationAttemptQueue") Destination handlingEventQueue; ... public void receivedHandlingEventRegistrationAttempt( HandlingEventRegistrationAttempt attempt) { ... jmsContext.createProducer() .setDeliveryMode(DeliveryMode.PERSISTENT) // The default :-) .setPriority(LOW_PRIORITY) .setDisableMessageID(true) .setDisableMessageTimestamp(true) .setStringProperty("source", source) .send(handlingEventQueue, attempt); }
  • 9. Message Driven Bean Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @MessageDriven(activationConfig = { @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destinationLookup", propertyValue = "jms/HandlingEventRegistrationAttemptQueue"), @ActivationConfigProperty(propertyName = "messageSelector", propertyValue = "source = 'mobile'")}) public class HandlingEventRegistrationAttemptConsumer implements MessageListener { ... public void onMessage(Message message) { ... HandlingEventRegistrationAttempt attempt = message.getBody(HandlingEventRegistrationAttempt.class); ... } }
  • 10. Great Possibilities for JMS 2.1 Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @ApplicationScoped @MaxConcurrency(10) public class HandlingEventRegistrationAttemptConsumer { @JmsListener( destinationLookup="jms/HandlingEventRegistrationAttemptQueue", selector="source = 'mobile'", batchSize=10, retry=5, retryDelay=7000, orderBy=TIMESTAMP) public void onEventRegistrationAttempt( HandlingEventRegistrationAttempt... attempts) { ... } }
  • 11. Asynchronous Session Beans • Dead simple asynchrony at the component level • Just an annotation on a POJO • Great when all that is required is greater throughput or responsiveness • Still transactional, thread-safe, throttled • Not loosely coupled, persistent, fault tolerant or error tolerant (client must explicitly handle errors) Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 12. Asynchronous Session Bean Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Asynchronous public void processPayment(Payment payment) { // CPU/IO heavy tasks to process a payment } @Asynchronous public Future<Report> generateReport(ReportParameters params) { try { Report report = renderReport(params); return new AsyncResult(report); } catch(ReportGenerationException e) { return new AsyncResult(new ErrorReport(e)); }
  • 13. Asynchronous Session Bean Client Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Inject ReportGeneratorService reportGeneratorService; ... Future<Report> future = reportGeneratorService.generateReport(parameters); ... if (future.isDone()) { Report report = future.get(); ... } ... future.cancel(true);
  • 14. @Asynchronous + CompletableFuture Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Asynchronous public CompletableFuture<Confirmation> processPayment(Order order) { ... Confirmation status = ...; return CompletableFuture<Confirmation>.completedFuture(status); } paymentService .processPayment(order) .thenAccept( confirmation -> System.out.println(confirmation));
  • 15. CDI Events/Observers • Compact, simple, elegant, type-safe events • Essentially the observer pattern formalized via a DI framework and annotations • Offers excellent solution to loose-coupling, type-safe filtering/chaining and asynchrony (but not much else) Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 16. CDI Events Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Inject @CargoInspected Event<Cargo> cargoInspected; ... public void inspectCargo(TrackingId trackingId) { ... cargoInspected.fire(cargo); } public void onCargoInspected( @Observes @CargoInspected Cargo cargo) { @Qualifier @Retention(RUNTIME) @Target({FIELD, PARAMETER}) public @interface CargoInspected {}
  • 17. Asynchronous CDI Events Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Inject @CargoInspected Event<Cargo> cargoInspected; ... public void inspectCargo(TrackingId trackingId) { ... cargoInspected.fireAsync(cargo); } public void onCargoInspected( @Observes(async=true) @CargoInspected Cargo cargo) {
  • 18. Asynchronous Servlets and NIO • Asynchronous Servlets maximize throughput/thread utilization • Decouple connection from request thread • Return request thread back to pool • Handle IO/CPU heavy work on separate backend thread • Close cached connection when done • NIO removes possible thread blocks during slow read/write • Get notified when the IO channel might be ready • Only read/write when IO channel is ready • Obvious need when Servlet IO is particularly heavy, otherwise a complex solution Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 19. Asynchronous Servlet Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @WebServlet(urlPatterns={"/report"}, asyncSupported=true) public class AsyncServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) { ... final AsyncContext asyncContext = request.startAsync(); asyncContext.start(() -> { ReportParameters parameters = parseReportParameters(asyncContext.getRequest()); Report report = generateReport(parameters); printReport(report, asyncContext); asyncContext.complete(); }); } }
  • 20. Asynchronous Servlet NIO (Output Stream) Copyright © 2015 CapTech Ventures, Inc. All rights reserved. private void printReport(Report report, AsyncContext context) { ServletOutputStream output = context.getResponse().getOutputStream(); WriteListener writeListener = new ReportWriteListener( output, report, context); output.setWriteListener(writeListener); }
  • 21. Asynchronous Servlet NIO (Write Listener) Copyright © 2015 CapTech Ventures, Inc. All rights reserved. class ReportWriteListener implements WriteListener { private ServletOutputStream output = null; private InputStream input = null; private AsyncContext context = null; ReportWriteListener(ServletOutputStream output, Report report, AsyncContext context) { this.output = output; this.input = report.asPdfStream(); this.context = context; } ...
  • 22. Asynchronous Servlet NIO (Write Listener) Copyright © 2015 CapTech Ventures, Inc. All rights reserved. ... public void onWritePossible() throws IOException { byte[] chunk = new byte[256]; int read = 0; while (output.isReady() && (read = input.read(chunk)) != -1) output.write(chunk, 0, read); if (read == -1) context.complete(); } public void onError(Throwable t) { context.complete(); t.printStackTrace(); } }
  • 23. Asynchronous JAX-RS • Asynchronous capabilities newly added to JAX-RS 2/Java EE 7 • Both on the server and client side • Server-side essentially identical to Servlet 3 async • Nicer declarative syntax • Client API async capabilities very symmetric to synchronous API • Both Futures and callbacks supported • JAX-RS server-side NIO promised for Java EE 8 Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 24. Asynchronous JAX-RS Resource Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Stateless @Path("/reports") public class ReportsResource { ... @Path("{id}") @GET @Produces({"application/pdf"}) @Asynchronous public void generateReport( @PathParam("id") Long id, @Suspended AsyncResponse response) { ResponseBuilder builder = Response.ok(renderReport(id)); builder.header("Content-Disposition", "attachment; filename=report.pdf"); response.resume(builder.build()); } }
  • 25. Asynchronous JAX-RS Client Copyright © 2015 CapTech Ventures, Inc. All rights reserved. WebTarget target = client.target("http://.../balance")... Future<Double> future = target.request() .async().get(Double.class)); ... Double balance = future.get(); WebTarget target = client.target("http://.../balance")... target.request().async().get( new InvocationCallback<Double>() { public void complete(Double balance) { // Process balance } public void failed(InvocationException e) { // Process error } });
  • 26. Asynchrony/NIO in WebSocket • WebSocket endpoints are inherently asynchronous/event-driven • No thread-connection association in the first place • True for server and client side • Writes/sends can be made asynchronous for better throughput • Very symmetric API for both sync and async • Futures or callbacks supported • Good idea to use asynchronous send in most cases Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 27. Asynchronous Remote WebSocket Endpoint Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Singleton @ServerEndpoint(value = "/chat"...) public class ChatServer { ... @OnOpen public void onOpen(Session peer) { peers.add(peer); } @OnClose public void onClose(Session peer) { peers.remove(peer); } @OnMessage public void onMessage(ChatMessage message) { for (Session peer : peers) { ...peer.getAsyncRemote().sendObject(message)... } } }
  • 28. Java EE Concurrency Utilities • Allows for lower-level threading/asynchronous capabilities in Java EE in a safe, reliable, managed fashion • Very specialized code, custom workloads • Fairly small extension of Java SE Concurrency Utilities • ManagedExecutorService • ManagedThreadFactory Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 29. Managed Executor Service Copyright © 2015 CapTech Ventures, Inc. All rights reserved. @Path("/reports") public class ReportsResource { @Resource ManagedExecutorService executor; ... @Path("{id}") @GET @Produces({"application/pdf"}) public void generateReport( @PathParam("id") Long id, @Suspended AsyncResponse response) { executor.execute(() -> { ResponseBuilder builder = Response.ok(renderReport(id)); builder.header("Content-Disposition", "attachment; filename=report.pdf"); response.resume(builder.build()); } } }
  • 30. Completable Future • Futures and callbacks both have serious flaws • Especially when it comes to significantly Reactive code • Java SE 8 CompletableFuture significantly better for Reactive programming • Non-blocking, event-driven, composable and functional (via lambdas) • Easy to integrate with Java EE 7 managed executors • Java EE 8 should embrace CompletableFuture uniformly Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 31. Looks are Deceiving… Person p = ... Assets assets = getAssets(p); Liabilities liabilities = getLiabilities(p); Credit credit = calculateCreditScore(assets, liabilities); History history = getHealthHistory(p); Health health = calculateHeathScore(history); Coverage coverage = underwrite(credit, health); Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 32. The Problem with Futures (and Callbacks) Person p = ... Future<Assets> f1 = executor.submit(() -> getAssets(p)); Future<Liabilities> f2 = executor.submit( () -> getLiabilities(p)); Future<Credit> f3 = executor.submit( () -> calculateCreditScore(f1.get(), f2.get())); // The unrelated calls below are now blocked for no reason Future<History> f4 = executor.submit(() -> getHealthHistory(p)); Future<Health> f5 = executor.submit( () -> calculateHeathScore(f4.get())); // Unrelated paths join below Future<Coverage> f6 = executor.submit( () -> underwrite(f3.get(), f5.get())); Copyright © 2015 CapTech Ventures, Inc. All rights reserved. Callbacks don’t block, but introduce callback hell… https://github.com/m-reza-rahman/reactive_javaee/blob/master/CallbackHell.java
  • 33. CompletableFuture Basics public CompletableFuture<Confirmation> processPayment( Order order) { CompletableFuture<Confirmation> future = new CompletableFuture<>(); executor.execute(() -> { Confirmation status = ... future.complete(status); }); return future; } Copyright © 2015 CapTech Ventures, Inc. All rights reserved. paymentService .processPayment(order) .thenAccept( confirmation -> System.out.println(confirmation));
  • 34. Functional Reactive to the Rescue? CompletableFuture<Assets> getAssets = CompletableFuture.supplyAsync(() -> getAssets(person)); CompletableFuture<Liabilities> getLiabilities = CompletableFuture.supplyAsync(() -> getLiabilities(person)); CompletableFuture<Credit> calculateCreditScore = getAssets.thenCombineAsync(getLiabilities, (assets, liabilities) -> calculateCreditScore(assets, liabilities)); CompletableFuture<Health> calculateHeathScore = CompletableFuture.supplyAsync(() -> getHealthHistory(person)) .thenApplyAsync(history -> calculateHeathScore(history)); Coverage coverage = calculateCreditScore.thenCombineAsync(calculateHeathScore, (credit, health) -> underwrite(credit, health)).join(); Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 35. More Possibilities • Reactive JPA • Last major reactive frontier for Java EE • Async/NIO support in underlying database driver/JDBC/Java SE prerequisite Copyright © 2015 CapTech Ventures, Inc. All rights reserved. CompletableFuture<List<Country>> countries = em.createQuery("SELECT c FROM Country c", Country.class) .async().getResultList(); • Reactive MVC • Similar to basic model in JAX-RS • Reactive JSF conceptually tough • Reactive streams
  • 36. Java EE Guardians http://javaee-guardians.io @javaee_guardian Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 37. Summary • Reactive programming well established technique, may be more important in the future • Java EE has long had rich support for Reactive techniques • Things should be improved even more with Java EE 8 • Java SE 8 helps quite a bit to make the programming model easier • Beyond Java EE application servers provide clustering, load-balancing, replication, failover, bandwidth throttling, resource pooling, thread pooling, caching, etc • Be careful – Reactive is not an easy approach to take Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 38. Resources • Java EE Tutorials • http://docs.oracle.com/javaee/7/tutorial/doc/home.htm • Java SE Tutorials • http://docs.oracle.com/javase/tutorial/ • Digging Deeper • http://docs.oracle.com/javaee/7/firstcup/doc/home.htm • https://glassfish.java.net/hol/ • http://cargotracker.java.net • Java EE Transparent Expert Groups • http://javaee-spec.java.net • Java EE Reference Implementation • http://glassfish.org Copyright © 2015 CapTech Ventures, Inc. All rights reserved.
  • 39. Copyright © 2015 CapTech Ventures, Inc. All rights reserved.