SlideShare a Scribd company logo
Going Reactive with Java 8
Ryan Knight& Björn Antonsson
Users Want
In-SyncData
Real-time Collaboration
InstantFeedback
To NotWait
Users Want Reactive Apps
www.ReactiveManifesto.org
Reactive Web Apps with
Play Framework
http://www.playframework.com
Reactive Web Apps with
Play Framework
Reactive Requests
Reactive Composition
Reactive Push
2-Way Reactive
Routes
Declarative, Type-safe URLMapping
VERB PATH CONTROLLER_METHOD
GET / controllers.Application.index()
GET /foo controllers.Application.foo()
Controllers
Synchronous Request
Usefulforrequests thatdon`thave anything to notblock on
publicstaticResultsyncFoo(){
returnok("syncfoo");
}
Reactive Requests
Asynchronous Request
Underthe covers Play implements allrequests in this way
publicstaticF.Promise<Result>asyncFoo(){
returnF.Promise.promise(()->ok("asyncfoo"));
}
Reactive Request (Async + Non-
Blocking)
Needs to have something to notblock on
publicstaticIntegerlongRunningCalculation(){
return(5134*5789)/349;
}
publicstaticF.Promise<Result>basicPromise(){
F.Promise<Integer>promise=F.Promise.promise(()->longRunningCalculation());
returnpromise.map((Integeri)->ok("Thecalculationresultis:"+i));
}
Reactive Requests
Two chained requests (clientto server& serverto typesafe.com)
both async& non-blocking
publicstaticF.Promise<Result>reactiveRequest(){
F.Promise<WS.Response>typesafePromise=WS.url("http://www.typesafe.com").get();
returntypesafePromise.map(response->ok(response.getBody()));
}
Reactive Composition
Three requests, two in parrallel(depending on thread availability)
allasync& non-blocking
publicstaticF.Promise<Result>reactiveComposition(){
finalF.Promise<WS.Response>twitterPromise=WS.url("http://www.twitter.com").get();
finalF.Promise<WS.Response>typesafePromise=WS.url("http://www.typesafe.com").get();
returntwitterPromise.flatMap((twitter)->
typesafePromise.map((typesafe)->
ok(twitter.getBody()+typesafe.getBody())));
}
Reactive Push with SSE
Async& Non-Blocking Serverto ClientPush
JavaController
publicstaticResultevents(){
EventSourceeventSource=newEventSource(){
publicvoidonConnected(){
sendData("hello");
}
};
returnok(eventSource);
}
CoffeeScriptClient
events=newEventSource("/events")
events.onmessage=(e)->
alert(e.data)
2-Way Reactive with WebSockets
Bi-directionalreactive push
JavaControllerwithJava8MethodReference
publicstaticWebSocket<String>echo(){
returnnewWebSocket<String>(){
publicvoidonReady(finalIn<String>in,finalOut<String>out){
in.onMessage(out::write);
}
};
}
CoffeeScriptClient
ws=newWebSocket("ws://localhost:9000/echo")
ws.onmessage=(message)->
console.log(message.data)
ws.onopen=()->
ws.send("foo")
Reactive Apps with Akka
http://akka.io
Reactive Apps with Akka
ActorBased
Highly Concurrent
Asynchronous
Distributable
Scales Up & Out
Akka Actor Properties
Message Based
EventDriven
Sane Concurrency Model
Non-RequestBased Lifecycle
Isolated Failure Handling
(Supervision)
Actors with Lambdas
Easily define the behaviorof youractor
publicstaticclassGreeterextendsAbstractActor{
Stringgreeting="";
publicGreeter(){
receive(ReceiveBuilder.
match(WhoToGreet.class,message->greeting="hello,"+message.who).
match(Greet.class,message->sender().tell(newGreeting(greeting),self())).
build());
}
}
Handing off Work
Forresponsiveness and/orfaulttolerance
publicclassHandoffActorextendsAbstractActor{{
receive(ReceiveBuilder.matchEquals("hello",s->{
ActorRefworker=
context().actorOf(Props.create(AbstractActor.class,
()->newAbstractActor(){{
receive(ReceiveBuilder.
match(String.class,s->{
//longrunningand/ordangerouscomputation
sender().tell(s.toUpperCase(),self());
self().tell(PoisonPill.getInstance(),self());
}).build());
}}));
worker.forward(s,context());
}).build());
}}
Supervision with Lambdas
Take differentactions depending on the failure
privatestaticSupervisorStrategystrategy=
newOneForOneStrategy(10,Duration.create("1minute"),DeciderBuilder.
match(ArithmeticException.class,e->resume()).
match(NullPointerException.class,e->restart()).
match(IllegalArgumentException.class,e->stop()).
matchAny(o->escalate()).build());
@Override
publicSupervisorStrategysupervisorStrategy(){
returnstrategy;
}
Changing Behavior with Lambdas
Quickly implementchanges in behavior
publicclassSwapperextendsAbstractLoggingActor{
publicSwapper(){
receive(ReceiveBuilder.
matchEquals(Swap,s->{
log().info("Hi");
context().become(ReceiveBuilder.
matchEquals(Swap,x->{
log().info("Ho");
context().unbecome();//gobacktopreviousbehavior
}).build(),false);//pushontopandkeepoldbehavior
}).build());
}
}
Actors as Finite State
Machines
A Fixed Numberof States
Defined Transitions Between States
Used to ModelforExample
Protocols
Processes
Finite State Machines
Defining Behaviorin States
publicclassBuncherextendsAbstractFSM<State,Data>{{
startWith(Idle,Uninitialized);
when(Idle,
matchEvent(SetTarget.class,Uninitialized.class,
(setTarget,uninitialized)->
stay().using(newTodo(setTarget.getRef(),newLinkedList<>()))));
when(Active,Duration.create(1,"second"),
matchEvent(Arrays.asList(Flush.class,StateTimeout()),Todo.class,
(event,todo)->goTo(Idle).using(todo.copy(newLinkedList<>()))));
//...transitionsleftout
initialize();
}}
Finite State Machines
Defining Transition Behavior
publicclassBuncherextendsAbstractFSM<State,Data>{{
startWith(Idle,Uninitialized);
//...statebehaviorleftout
onTransition(
matchState(Active,Idle,()->{
//reusethismatcher
finalUnitMatch<Data>m=UnitMatch.create(
matchData(Todo.class,
todo->todo.getTarget().tell(newBatch(todo.getQueue()),self())));
m.match(stateData());
}).
state(Idle,Active,()->{/*Dosomethinghere*/}));
initialize();
}}
Interoperability
https://github.com/scala/scala-java8-compat
Java Scala Interoperability
Seamlessly Work with ScalaFutures
importscala.concurrent.*;
importstaticscala.compat.java8.JFunction.*;
classTest{
privatestaticFuture<Integer>futureExample(Future<String>future,ExecutionContextec){
returnfuture.map(func(s->s.toUpperCase()),ec).map(func(s->s.length()),ec);
}
}
Java Scala Interoperability
Seamlessly ConvertBetween JavaCompletionStage and Scala
Future
importjava.util.concurrent.CompletionStage;
importscala.concurrent.Future;
importstaticscala.compat.java8.FutureConverters.*;
finalCompletionStage<String>cs=...//fromanasyncJavaAPI
finalFuture<String>f=toScala(cs);
...
finalFuture<Integer>f2=...//fromanasyncScalaAPI
finalCompletionStage<Integer>cs2=toJava(f2);
Demo: Reactive Stocks (Java 8)
Getthe ActivatorTemplate:
http://typesafe.com/activator/template/reactive-stocks-java8
AkkaActors forthread-safe state and non-requestbased events
Play Framework forReactive Composition, Reactive Push, and a
JavaScriptUI
Reactive Stocks (Java8)
Get Started with Activator
http://typesafe.com/activator/template/hello-akka-java8
http://typesafe.com/activator/template/reactive-java8-play
http://typesafe.com/activator/template/akka-supervision-java-lambda
http://typesafe.com/activator/template/akka-sample-fsm-java-lambda
http://typesafe.com/activator/template/akka-sample-persistence-java-lambda
http://typesafe.com/activator/template/reactive-stocks-java8
Hello Akka!(Java8)
Go Reactive with Java8 & Play Framework
AkkaSupervision in Javawith Lambdas
AkkaFSMin Javawith Lambdas
AkkaPersistence Samples in Javawith Lambdas
Reactive Stocks (Java8)
Typesafe Webinar: Going Reactive with Java 8

More Related Content

Similar to Typesafe Webinar: Going Reactive with Java 8

The lazy programmers guide to consuming web services
The lazy programmers guide to consuming web services The lazy programmers guide to consuming web services
The lazy programmers guide to consuming web services
mamnun
 
The Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane MaldiniThe Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane Maldini
VMware Tanzu
 
FullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + AngularFullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
Loiane Groner
 
Hybrid Web Applications
Hybrid Web ApplicationsHybrid Web Applications
Hybrid Web Applications
James Da Costa
 
React vs angular (mobile first battle)
React vs angular (mobile first battle)React vs angular (mobile first battle)
React vs angular (mobile first battle)
Michael Haberman
 
Connect.js 2015 - Building Native Mobile Applications with Javascript
Connect.js 2015 - Building Native Mobile Applications with JavascriptConnect.js 2015 - Building Native Mobile Applications with Javascript
Connect.js 2015 - Building Native Mobile Applications with Javascript
joshcjensen
 
Taking Web Applications Offline
Taking Web Applications OfflineTaking Web Applications Offline
Taking Web Applications Offline
Matt Casto
 
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConfFull-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
Loiane Groner
 
Retrofit library for android
Retrofit library for androidRetrofit library for android
Retrofit library for android
InnovationM
 
Retrofit Library In Android
Retrofit Library In AndroidRetrofit Library In Android
Retrofit Library In Android
InnovationM
 
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java GirlFull-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Loiane Groner
 
How To Manage API Request with AXIOS on a React Native App
How To Manage API Request with AXIOS on a React Native AppHow To Manage API Request with AXIOS on a React Native App
How To Manage API Request with AXIOS on a React Native App
Andolasoft Inc
 
Building Modern Web Applications using React and Redux
 Building Modern Web Applications using React and Redux Building Modern Web Applications using React and Redux
Building Modern Web Applications using React and Redux
Maxime Najim
 
Jsf
JsfJsf
PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事longfei.dong
 
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
jaemyun lee
 
Reactive programming for java developers
Reactive programming for java developersReactive programming for java developers
Reactive programming for java developers
Constantin Popa
 
React & Redux in Hulu
React & Redux in HuluReact & Redux in Hulu
React & Redux in Hulu
Morgan Cheng
 
As-t-on encore besoin d'un framework web ?
As-t-on encore besoin d'un framework web ?As-t-on encore besoin d'un framework web ?
As-t-on encore besoin d'un framework web ?ConFoo
 
Do we still need a web framework ?
Do we still need a web framework ?Do we still need a web framework ?
Do we still need a web framework ?Mathieu Carbou
 

Similar to Typesafe Webinar: Going Reactive with Java 8 (20)

The lazy programmers guide to consuming web services
The lazy programmers guide to consuming web services The lazy programmers guide to consuming web services
The lazy programmers guide to consuming web services
 
The Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane MaldiniThe Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane Maldini
 
FullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + AngularFullStack Reativo com Spring WebFlux + Angular
FullStack Reativo com Spring WebFlux + Angular
 
Hybrid Web Applications
Hybrid Web ApplicationsHybrid Web Applications
Hybrid Web Applications
 
React vs angular (mobile first battle)
React vs angular (mobile first battle)React vs angular (mobile first battle)
React vs angular (mobile first battle)
 
Connect.js 2015 - Building Native Mobile Applications with Javascript
Connect.js 2015 - Building Native Mobile Applications with JavascriptConnect.js 2015 - Building Native Mobile Applications with Javascript
Connect.js 2015 - Building Native Mobile Applications with Javascript
 
Taking Web Applications Offline
Taking Web Applications OfflineTaking Web Applications Offline
Taking Web Applications Offline
 
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConfFull-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
Full-Stack Reativo com Spring WebFlux + Angular - FiqueEmCasaConf
 
Retrofit library for android
Retrofit library for androidRetrofit library for android
Retrofit library for android
 
Retrofit Library In Android
Retrofit Library In AndroidRetrofit Library In Android
Retrofit Library In Android
 
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java GirlFull-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
Full-Stack Reativo com Spring WebFlux + Angular - Devs Java Girl
 
How To Manage API Request with AXIOS on a React Native App
How To Manage API Request with AXIOS on a React Native AppHow To Manage API Request with AXIOS on a React Native App
How To Manage API Request with AXIOS on a React Native App
 
Building Modern Web Applications using React and Redux
 Building Modern Web Applications using React and Redux Building Modern Web Applications using React and Redux
Building Modern Web Applications using React and Redux
 
Jsf
JsfJsf
Jsf
 
PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事PhoneGap:你应该知道的12件事
PhoneGap:你应该知道的12件事
 
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
Pycon Korea 2018-Sanic을 활용하여 Microservice 구축하기-이재면
 
Reactive programming for java developers
Reactive programming for java developersReactive programming for java developers
Reactive programming for java developers
 
React & Redux in Hulu
React & Redux in HuluReact & Redux in Hulu
React & Redux in Hulu
 
As-t-on encore besoin d'un framework web ?
As-t-on encore besoin d'un framework web ?As-t-on encore besoin d'un framework web ?
As-t-on encore besoin d'un framework web ?
 
Do we still need a web framework ?
Do we still need a web framework ?Do we still need a web framework ?
Do we still need a web framework ?
 

Recently uploaded

Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Tobias Schneck
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
Frank van Harmelen
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Product School
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Ramesh Iyer
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
James Anderson
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
Product School
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
Product School
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
DianaGray10
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
Abida Shariff
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 

Recently uploaded (20)

Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
Kubernetes & AI - Beauty and the Beast !?! @KCD Istanbul 2024
 
Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*Neuro-symbolic is not enough, we need neuro-*semantic*
Neuro-symbolic is not enough, we need neuro-*semantic*
 
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
Unsubscribed: Combat Subscription Fatigue With a Membership Mentality by Head...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
Builder.ai Founder Sachin Dev Duggal's Strategic Approach to Create an Innova...
 
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
GDG Cloud Southlake #33: Boule & Rebala: Effective AppSec in SDLC using Deplo...
 
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
De-mystifying Zero to One: Design Informed Techniques for Greenfield Innovati...
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
From Siloed Products to Connected Ecosystem: Building a Sustainable and Scala...
 
Connector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a buttonConnector Corner: Automate dynamic content and events by pushing a button
Connector Corner: Automate dynamic content and events by pushing a button
 
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdfFIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
FIDO Alliance Osaka Seminar: Passkeys at Amazon.pdf
 
FIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdfFIDO Alliance Osaka Seminar: Overview.pdf
FIDO Alliance Osaka Seminar: Overview.pdf
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptxIOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
IOS-PENTESTING-BEGINNERS-PRACTICAL-GUIDE-.pptx
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 

Typesafe Webinar: Going Reactive with Java 8

  • 1. Going Reactive with Java 8 Ryan Knight& Björn Antonsson
  • 3. Users Want Reactive Apps www.ReactiveManifesto.org
  • 4. Reactive Web Apps with Play Framework http://www.playframework.com
  • 5. Reactive Web Apps with Play Framework Reactive Requests Reactive Composition Reactive Push 2-Way Reactive
  • 6. Routes Declarative, Type-safe URLMapping VERB PATH CONTROLLER_METHOD GET / controllers.Application.index() GET /foo controllers.Application.foo()
  • 7. Controllers Synchronous Request Usefulforrequests thatdon`thave anything to notblock on publicstaticResultsyncFoo(){ returnok("syncfoo"); }
  • 9. Asynchronous Request Underthe covers Play implements allrequests in this way publicstaticF.Promise<Result>asyncFoo(){ returnF.Promise.promise(()->ok("asyncfoo")); }
  • 10. Reactive Request (Async + Non- Blocking) Needs to have something to notblock on publicstaticIntegerlongRunningCalculation(){ return(5134*5789)/349; } publicstaticF.Promise<Result>basicPromise(){ F.Promise<Integer>promise=F.Promise.promise(()->longRunningCalculation()); returnpromise.map((Integeri)->ok("Thecalculationresultis:"+i)); }
  • 11. Reactive Requests Two chained requests (clientto server& serverto typesafe.com) both async& non-blocking publicstaticF.Promise<Result>reactiveRequest(){ F.Promise<WS.Response>typesafePromise=WS.url("http://www.typesafe.com").get(); returntypesafePromise.map(response->ok(response.getBody())); }
  • 12. Reactive Composition Three requests, two in parrallel(depending on thread availability) allasync& non-blocking publicstaticF.Promise<Result>reactiveComposition(){ finalF.Promise<WS.Response>twitterPromise=WS.url("http://www.twitter.com").get(); finalF.Promise<WS.Response>typesafePromise=WS.url("http://www.typesafe.com").get(); returntwitterPromise.flatMap((twitter)-> typesafePromise.map((typesafe)-> ok(twitter.getBody()+typesafe.getBody()))); }
  • 13. Reactive Push with SSE Async& Non-Blocking Serverto ClientPush JavaController publicstaticResultevents(){ EventSourceeventSource=newEventSource(){ publicvoidonConnected(){ sendData("hello"); } }; returnok(eventSource); } CoffeeScriptClient events=newEventSource("/events") events.onmessage=(e)-> alert(e.data)
  • 14. 2-Way Reactive with WebSockets Bi-directionalreactive push JavaControllerwithJava8MethodReference publicstaticWebSocket<String>echo(){ returnnewWebSocket<String>(){ publicvoidonReady(finalIn<String>in,finalOut<String>out){ in.onMessage(out::write); } }; } CoffeeScriptClient ws=newWebSocket("ws://localhost:9000/echo") ws.onmessage=(message)-> console.log(message.data) ws.onopen=()-> ws.send("foo")
  • 15. Reactive Apps with Akka http://akka.io
  • 16. Reactive Apps with Akka ActorBased Highly Concurrent Asynchronous Distributable Scales Up & Out
  • 17. Akka Actor Properties Message Based EventDriven Sane Concurrency Model Non-RequestBased Lifecycle Isolated Failure Handling (Supervision)
  • 18. Actors with Lambdas Easily define the behaviorof youractor publicstaticclassGreeterextendsAbstractActor{ Stringgreeting=""; publicGreeter(){ receive(ReceiveBuilder. match(WhoToGreet.class,message->greeting="hello,"+message.who). match(Greet.class,message->sender().tell(newGreeting(greeting),self())). build()); } }
  • 19. Handing off Work Forresponsiveness and/orfaulttolerance publicclassHandoffActorextendsAbstractActor{{ receive(ReceiveBuilder.matchEquals("hello",s->{ ActorRefworker= context().actorOf(Props.create(AbstractActor.class, ()->newAbstractActor(){{ receive(ReceiveBuilder. match(String.class,s->{ //longrunningand/ordangerouscomputation sender().tell(s.toUpperCase(),self()); self().tell(PoisonPill.getInstance(),self()); }).build()); }})); worker.forward(s,context()); }).build()); }}
  • 20. Supervision with Lambdas Take differentactions depending on the failure privatestaticSupervisorStrategystrategy= newOneForOneStrategy(10,Duration.create("1minute"),DeciderBuilder. match(ArithmeticException.class,e->resume()). match(NullPointerException.class,e->restart()). match(IllegalArgumentException.class,e->stop()). matchAny(o->escalate()).build()); @Override publicSupervisorStrategysupervisorStrategy(){ returnstrategy; }
  • 21. Changing Behavior with Lambdas Quickly implementchanges in behavior publicclassSwapperextendsAbstractLoggingActor{ publicSwapper(){ receive(ReceiveBuilder. matchEquals(Swap,s->{ log().info("Hi"); context().become(ReceiveBuilder. matchEquals(Swap,x->{ log().info("Ho"); context().unbecome();//gobacktopreviousbehavior }).build(),false);//pushontopandkeepoldbehavior }).build()); } }
  • 22. Actors as Finite State Machines A Fixed Numberof States Defined Transitions Between States Used to ModelforExample Protocols Processes
  • 23. Finite State Machines Defining Behaviorin States publicclassBuncherextendsAbstractFSM<State,Data>{{ startWith(Idle,Uninitialized); when(Idle, matchEvent(SetTarget.class,Uninitialized.class, (setTarget,uninitialized)-> stay().using(newTodo(setTarget.getRef(),newLinkedList<>())))); when(Active,Duration.create(1,"second"), matchEvent(Arrays.asList(Flush.class,StateTimeout()),Todo.class, (event,todo)->goTo(Idle).using(todo.copy(newLinkedList<>())))); //...transitionsleftout initialize(); }}
  • 24. Finite State Machines Defining Transition Behavior publicclassBuncherextendsAbstractFSM<State,Data>{{ startWith(Idle,Uninitialized); //...statebehaviorleftout onTransition( matchState(Active,Idle,()->{ //reusethismatcher finalUnitMatch<Data>m=UnitMatch.create( matchData(Todo.class, todo->todo.getTarget().tell(newBatch(todo.getQueue()),self()))); m.match(stateData()); }). state(Idle,Active,()->{/*Dosomethinghere*/})); initialize(); }}
  • 26. Java Scala Interoperability Seamlessly Work with ScalaFutures importscala.concurrent.*; importstaticscala.compat.java8.JFunction.*; classTest{ privatestaticFuture<Integer>futureExample(Future<String>future,ExecutionContextec){ returnfuture.map(func(s->s.toUpperCase()),ec).map(func(s->s.length()),ec); } }
  • 27. Java Scala Interoperability Seamlessly ConvertBetween JavaCompletionStage and Scala Future importjava.util.concurrent.CompletionStage; importscala.concurrent.Future; importstaticscala.compat.java8.FutureConverters.*; finalCompletionStage<String>cs=...//fromanasyncJavaAPI finalFuture<String>f=toScala(cs); ... finalFuture<Integer>f2=...//fromanasyncScalaAPI finalCompletionStage<Integer>cs2=toJava(f2);
  • 28. Demo: Reactive Stocks (Java 8) Getthe ActivatorTemplate: http://typesafe.com/activator/template/reactive-stocks-java8 AkkaActors forthread-safe state and non-requestbased events Play Framework forReactive Composition, Reactive Push, and a JavaScriptUI Reactive Stocks (Java8)
  • 29. Get Started with Activator http://typesafe.com/activator/template/hello-akka-java8 http://typesafe.com/activator/template/reactive-java8-play http://typesafe.com/activator/template/akka-supervision-java-lambda http://typesafe.com/activator/template/akka-sample-fsm-java-lambda http://typesafe.com/activator/template/akka-sample-persistence-java-lambda http://typesafe.com/activator/template/reactive-stocks-java8 Hello Akka!(Java8) Go Reactive with Java8 & Play Framework AkkaSupervision in Javawith Lambdas AkkaFSMin Javawith Lambdas AkkaPersistence Samples in Javawith Lambdas Reactive Stocks (Java8)