SlideShare a Scribd company logo
Dr. Roland Kuhn
Akka Tech Lead
@rolandkuhn
Reactive Streams
Handling Data-Flows the Reactive Way
Introduction: Streams
What is a Stream?
• ephemeral flow of data
• focused on describing transformation
• possibly unbounded in size
3
Common uses of Streams
• bulk data transfer
• real-time data sources
• batch processing of large data sets
• monitoring and analytics
4
What is special about Reactive Streams?
Reactive	
  Applications
The Four Reactive Traits
6
http://reactivemanifesto.org/
Needed: Asynchrony
• Resilience demands it:
• encapsulation
• isolation
• Scalability demands it:
• distribution across nodes
• distribution across cores
7
Many Kinds of Async Boundaries
8
Many Kinds of Async Boundaries
• between different applications
8
Many Kinds of Async Boundaries
• between different applications
• between network nodes
8
Many Kinds of Async Boundaries
• between different applications
• between network nodes
• between CPUs
8
Many Kinds of Async Boundaries
• between different applications
• between network nodes
• between CPUs
• between threads
8
Many Kinds of Async Boundaries
• between different applications
• between network nodes
• between CPUs
• between threads
• between actors
8
The Problem:
!
Getting Data across an Async Boundary
Possible Solutions
10
Possible Solutions
• the Traditional way: blocking calls
10
Possible Solutions
10
Possible Solutions
!
• the Push way: buffering and/or dropping
11
Possible Solutions
11
Possible Solutions
!
!
• the Reactive way:

non-blocking & non-dropping & bounded
12
How do we achieve that?
Supply and Demand
• data items flow downstream
• demand flows upstream
• data items flow only when there is demand
• recipient is in control of incoming data rate
• data in flight is bounded by signaled demand
14
Publisher Subscriber
data
demand
Dynamic Push–Pull
• “push” behavior when consumer is faster
• “pull” behavior when producer is faster
• switches automatically between these
• batching demand allows batching data
15
Publisher Subscriber
data
demand
Explicit Demand: Tailored Flow Control
16
demand
data
splitting the data means merging the demand
Explicit Demand: Tailored Flow Control
17
merging the data means splitting the demand
Reactive Streams
• asynchronous non-blocking data flow
• asynchronous non-blocking demand flow
• minimal coordination and contention
• message passing allows for distribution
• across applications
• across nodes
• across CPUs
• across threads
• across actors
18
Are Streams Collections?
What is a Collection?
20
What is a Collection?
• Oxford Dictionary:
• “a group of things or people”
20
What is a Collection?
• Oxford Dictionary:
• “a group of things or people”
• wikipedia:
• “a grouping of some variable number of data items”
20
What is a Collection?
• Oxford Dictionary:
• “a group of things or people”
• wikipedia:
• “a grouping of some variable number of data items”
• backbone.js:
• “collections are simply an ordered set of models”
20
What is a Collection?
• Oxford Dictionary:
• “a group of things or people”
• wikipedia:
• “a grouping of some variable number of data items”
• backbone.js:
• “collections are simply an ordered set of models”
• java.util.Collection:
• definite size, provides an iterator, query membership
20
User Expectations
• an Iterator is expected to visit all elements

(especially with immutable collections)
• x.head + x.tail == x
• the contents does not depend on who is
processing the collection
• the contents does not depend on when the
processing happens

(especially with immutable collections)
21
Streams have Unexpected Properties
• the observed sequence depends on
• … when the observer subscribed to the stream
• … whether the observer can process fast enough
• … whether the streams flows fast enough
22
Streams are not Collections!
• java.util.stream:

Stream is not derived from Collection

“Streams differ from Coll’s in several ways”
• no storage
• functional in nature
• laziness seeking
• possibly unbounded
• consumable
23
Streams are not Collections!
• a collection can be streamed
• a stream observer can create a collection
• … but saying that a Stream is just a lazy
Collection evokes the wrong associations
24
So, Reactive Streams:
why not just java.util.stream.Stream?
Java 8 Stream
26
import java.util.stream.*;
!
// get some stream
final Stream<Integer> s = Stream.of(1, 2, 3);
// describe transformation
final Stream<String> s2 = s.map(i -> "a" + i);
// make a pull collection
s2.iterator();
// or alternatively push it somewhere
s2.forEach(i -> System.out.println(i));
// (need to pick one, Stream is consumable)
Java 8 Stream
• provides a DSL for describing transformation
• introduces staged computation

(but does not allow reuse)
• prescribes an eager model of execution
• offers either push or pull, chosen statically
27
What about RxJava?
RxJava
29
import rx.Observable;
import rx.Observable.*;
!
// get some stream source
final Observable<Integer> obs = range(1, 3);
// describe transformation
final Observable<String> obs2 =
obs.map(i -> "b" + i);
// and use it twice
obs2.subscribe(i -> System.out.println(i));
obs2.filter(i -> i.equals("b2"))
.subscribe(i -> System.out.println(i));
RxJava
• implements pure “push” model
• includes extensive DSL for transformations
• only allows blocking for back pressure
• currently uses unbounded buffering for
crossing an async boundary
• work on distributed Observables sparked
participation in Reactive Streams
30
The Reactive Streams Project
Participants
• Engineers from
• Netflix
• Oracle
• Pivotal
• Red Hat
• Twitter
• Typesafe
• Individuals like Doug Lea and Todd Montgomery
32
The Motivation
• all participants had the same basic problem
• all are building tools for their community
• a common solution benefits everybody
• interoperability to make best use of efforts
• e.g. use Reactor data store driver with Akka
transformation pipeline and Rx monitoring to drive a
vert.x REST API (purely made up, at this point)
33
see also Jon Brisbin’s post on “Tribalism as a Force for Good”
Recipe for Success
• minimal interfaces
• rigorous specification of semantics
• full TCK for verification of implementation
• complete freedom for many idiomatic APIs
34
The Meat
35
trait Publisher[T] {
def subscribe(sub: Subscriber[T]): Unit
}
trait Subscription {
def requestMore(n: Int): Unit
def cancel(): Unit
}
trait Subscriber[T] {
def onSubscribe(s: Subscription): Unit
def onNext(elem: T): Unit
def onError(thr: Throwable): Unit
def onComplete(): Unit
}
The Sauce
• all calls on Subscriber must dispatch async
• all calls on Subscription must not block
• Publisher is just there to create Subscriptions
36
How does it Connect?
37
SubscriberPublisher
subscribe
onSubscribeSubscription
requestMore
onNext
Akka Streams
Akka Streams
• powered by Akka Actors
• execution
• distribution
• resilience
• type-safe streaming through Actors with
bounded buffering
39
Basic Akka Example
40
implicit val system = ActorSystem("Sys")
val mat = FlowMaterializer(...)
!
Flow(text.split("s").toVector).
map(word => word.toUpperCase).
foreach(tranformed => println(tranformed)).
onComplete(mat) {
case Success(_) => system.shutdown()
case Failure(e) =>
println("Failure: " + e.getMessage)
system.shutdown()
}
More Advanced Akka Example
41
val s = Source.fromFile("log.txt", "utf-8")
Flow(s.getLines()).
groupBy {
case LogLevelPattern(level) => level
case other => "OTHER"
}.
foreach { case (level, producer) =>
val out = new PrintWriter(level+".txt")
Flow(producer).
foreach(line => out.println(line)).
onComplete(mat)(_ => Try(out.close()))
}.
onComplete(mat)(_ => Try(s.close()))
Java 8 Example
42
final ActorSystem system = ActorSystem.create("Sys");
final MaterializerSettings settings =
MaterializerSettings.create();
final FlowMaterializer materializer =
FlowMaterializer.create(settings, system);
!
final String[] lookup = { "a", "b", "c", "d", "e", "f" };
final Iterable<Integer> input = Arrays.asList(0, 1, 2, 3, 4, 5);
!
Flow.create(input).drop(2).take(3). // leave 2, 3, 4
map(elem -> lookup[elem]). // translate to "c","d","e"
filter(elem -> !elem.equals("c")). // filter out the "c"
grouped(2). // make into a list
mapConcat(list -> list). // flatten the list
fold("", (acc, elem) -> acc + elem). // accumulate into "de"
foreach(elem -> System.out.println(elem)). // print it
consume(materializer);
Akka TCP Echo Server
43
val future = IO(StreamTcp) ? Bind(addr, ...)
future.onComplete {
case Success(server: TcpServerBinding) =>
println("listen at "+server.localAddress)
!
Flow(server.connectionStream).foreach{ c =>
println("client from "+c.remoteAddress)
c.inputStream.produceTo(c.outputStream)
}.consume(mat)
!
case Failure(ex) =>
println("cannot bind: "+ex)
system.shutdown()
}
Akka HTTP Sketch (NOT REAL CODE)
44
val future = IO(Http) ? RequestChannelSetup(...)
future.onSuccess {
case ch: HttpRequestChannel =>
val p = ch.processor[Int]
val body = Flow(new File(...)).toProducer(mat)
Flow(HttpRequest(method = POST,
uri = "http://ex.amp.le/42",
entity = body) -> 42)
.produceTo(mat, p)
Flow(p).map { case (resp, token) =>
val out = FileSink(new File(...))
Flow(resp.entity.data).produceTo(mat, out)
}.consume(mat)
}
Closing Remarks
Current State
• Early Preview is available:

"org.reactivestreams" % "reactive-streams-spi" % "0.2"

"com.typesafe.akka" %% "akka-stream-experimental" % "0.3"
• check out the Activator template

"Akka Streams with Scala!"

(https://github.com/typesafehub/activator-akka-stream-scala)
46
Next Steps
• we work towards inclusion in future JDK
• try it out and give feedback!
• http://reactive-streams.org/
• https://github.com/reactive-streams
47
©Typesafe 2014 – All Rights Reserved

More Related Content

PDF
Customer identity and access management (ciam)
PPTX
Security War Games
PDF
Mapping ATT&CK Techniques to ENGAGE Activities
PDF
Threat Modelling - It's not just for developers
PPTX
Security and compliance in Office 365 -Part 1
PPTX
[DSC Europe 23] Spela Poklukar & Tea Brasanac - Retrieval Augmented Generation
PPTX
Purple Team - Work it out: Organizing Effective Adversary Emulation Exercises
PDF
Breach and attack simulation tools
Customer identity and access management (ciam)
Security War Games
Mapping ATT&CK Techniques to ENGAGE Activities
Threat Modelling - It's not just for developers
Security and compliance in Office 365 -Part 1
[DSC Europe 23] Spela Poklukar & Tea Brasanac - Retrieval Augmented Generation
Purple Team - Work it out: Organizing Effective Adversary Emulation Exercises
Breach and attack simulation tools

What's hot (20)

PDF
ATTACKers Think in Graphs: Building Graphs for Threat Intelligence
PDF
A Case Study of the Capital One Data Breach
PPTX
Devopsguys DevOps 101 for recruiters
PDF
ATT&CK Updates- ATT&CK's Open Source
PPTX
State of the Cloud 2023 with Bessemer Venture Partners
PPTX
Generative AI Application Development using LangChain and LangFlow
PPTX
Nowhere to Hide: Expose Threats in Real-time with IBM QRadar Network Insights
PDF
OWASP-Web-Security-testing-4.2
PDF
Splunk-Presentation
PDF
Defending against Java Deserialization Vulnerabilities
PDF
MITRE ATT&CKcon 2.0: Using Threat Intelligence to Focus ATT&CK Activities; Da...
PDF
Introduction to Elasticsearch
PDF
RonDB, a NewSQL Feature Store for AI applications.pdf
PDF
ATT&CK Updates- Defensive ATT&CK
PDF
Tracking Noisy Behavior and Risk-Based Alerting with ATT&CK
PPTX
Splunk Architecture
PDF
Security Analyst Workshop - 20190314
PPTX
SOC Architecture Workshop - Part 1
PPTX
Effective Threat Hunting with Tactical Threat Intelligence
PPTX
Mocking with salesforce using Munit
ATTACKers Think in Graphs: Building Graphs for Threat Intelligence
A Case Study of the Capital One Data Breach
Devopsguys DevOps 101 for recruiters
ATT&CK Updates- ATT&CK's Open Source
State of the Cloud 2023 with Bessemer Venture Partners
Generative AI Application Development using LangChain and LangFlow
Nowhere to Hide: Expose Threats in Real-time with IBM QRadar Network Insights
OWASP-Web-Security-testing-4.2
Splunk-Presentation
Defending against Java Deserialization Vulnerabilities
MITRE ATT&CKcon 2.0: Using Threat Intelligence to Focus ATT&CK Activities; Da...
Introduction to Elasticsearch
RonDB, a NewSQL Feature Store for AI applications.pdf
ATT&CK Updates- Defensive ATT&CK
Tracking Noisy Behavior and Risk-Based Alerting with ATT&CK
Splunk Architecture
Security Analyst Workshop - 20190314
SOC Architecture Workshop - Part 1
Effective Threat Hunting with Tactical Threat Intelligence
Mocking with salesforce using Munit
Ad

Similar to Reactive Streams: Handling Data-Flow the Reactive Way (20)

PDF
Reactive Streams 1.0.0 and Why You Should Care (webinar)
PPTX
Introduction to Akka - Atlanta Java Users Group
PDF
Streamlining with rx
PDF
Akka Streams and HTTP
PDF
Drinking from the Firehose - Real-time Metrics
PDF
ELK stack introduction
PPTX
CTS2 Development Framework In Action
PDF
Flowchain: A case study on building a Blockchain for the IoT
PPTX
Meetup on Apache Zookeeper
PDF
Introduction to SolrCloud
PPTX
"Data Provenance: Principles and Why it matters for BioMedical Applications"
PDF
Introduction to Galaxy and RNA-Seq
PDF
Journey into Reactive Streams and Akka Streams
PPTX
Geode introduction
PDF
Cloud Architect Alliance #15: Openstack
PDF
Reactive Programming in Java and Spring Framework 5
PDF
Kubernetes2
PPTX
CERN IT Monitoring
PDF
Apache Big Data EU 2016: Building Streaming Applications with Apache Apex
PDF
Springone2gx 2014 Reactive Streams and Reactor
Reactive Streams 1.0.0 and Why You Should Care (webinar)
Introduction to Akka - Atlanta Java Users Group
Streamlining with rx
Akka Streams and HTTP
Drinking from the Firehose - Real-time Metrics
ELK stack introduction
CTS2 Development Framework In Action
Flowchain: A case study on building a Blockchain for the IoT
Meetup on Apache Zookeeper
Introduction to SolrCloud
"Data Provenance: Principles and Why it matters for BioMedical Applications"
Introduction to Galaxy and RNA-Seq
Journey into Reactive Streams and Akka Streams
Geode introduction
Cloud Architect Alliance #15: Openstack
Reactive Programming in Java and Spring Framework 5
Kubernetes2
CERN IT Monitoring
Apache Big Data EU 2016: Building Streaming Applications with Apache Apex
Springone2gx 2014 Reactive Streams and Reactor
Ad

More from Roland Kuhn (10)

PDF
Taming Distribution: Formal Protocols for Akka Typed
PDF
Distributed systems vs compositionality
PDF
Reactive Design Patterns — J on the Beach
PDF
The Newest in Session Types
PDF
Akka Typed — between Session Types and the Actor Model
PDF
Project Gålbma – Actors vs Types
PDF
Akka and AngularJS – Reactive Applications in Practice
PDF
Go Reactive: Blueprint for Future Applications
PDF
Akka cluster overview at 010dev
PDF
Akka typed-channels
Taming Distribution: Formal Protocols for Akka Typed
Distributed systems vs compositionality
Reactive Design Patterns — J on the Beach
The Newest in Session Types
Akka Typed — between Session Types and the Actor Model
Project Gålbma – Actors vs Types
Akka and AngularJS – Reactive Applications in Practice
Go Reactive: Blueprint for Future Applications
Akka cluster overview at 010dev
Akka typed-channels

Recently uploaded (20)

PPTX
Materi_Pemrograman_Komputer-Looping.pptx
PDF
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
PDF
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
PDF
medical staffing services at VALiNTRY
PPTX
Essential Infomation Tech presentation.pptx
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PDF
Internet Downloader Manager (IDM) Crack 6.42 Build 41
PDF
System and Network Administraation Chapter 3
PDF
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
PDF
Softaken Excel to vCard Converter Software.pdf
PPTX
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
PDF
Complete React Javascript Course Syllabus.pdf
PPT
Introduction Database Management System for Course Database
PDF
System and Network Administration Chapter 2
DOCX
The Five Best AI Cover Tools in 2025.docx
PDF
How Creative Agencies Leverage Project Management Software.pdf
PDF
Adobe Illustrator 28.6 Crack My Vision of Vector Design
PDF
Which alternative to Crystal Reports is best for small or large businesses.pdf
PPTX
Materi-Enum-and-Record-Data-Type (1).pptx
Materi_Pemrograman_Komputer-Looping.pptx
Adobe Premiere Pro 2025 (v24.5.0.057) Crack free
Why TechBuilder is the Future of Pickup and Delivery App Development (1).pdf
medical staffing services at VALiNTRY
Essential Infomation Tech presentation.pptx
Design an Analysis of Algorithms I-SECS-1021-03
Wondershare Filmora 15 Crack With Activation Key [2025
Internet Downloader Manager (IDM) Crack 6.42 Build 41
System and Network Administraation Chapter 3
SAP S4 Hana Brochure 3 (PTS SYSTEMS AND SOLUTIONS)
Softaken Excel to vCard Converter Software.pdf
Agentic AI : A Practical Guide. Undersating, Implementing and Scaling Autono...
Complete React Javascript Course Syllabus.pdf
Introduction Database Management System for Course Database
System and Network Administration Chapter 2
The Five Best AI Cover Tools in 2025.docx
How Creative Agencies Leverage Project Management Software.pdf
Adobe Illustrator 28.6 Crack My Vision of Vector Design
Which alternative to Crystal Reports is best for small or large businesses.pdf
Materi-Enum-and-Record-Data-Type (1).pptx

Reactive Streams: Handling Data-Flow the Reactive Way

  • 1. Dr. Roland Kuhn Akka Tech Lead @rolandkuhn Reactive Streams Handling Data-Flows the Reactive Way
  • 3. What is a Stream? • ephemeral flow of data • focused on describing transformation • possibly unbounded in size 3
  • 4. Common uses of Streams • bulk data transfer • real-time data sources • batch processing of large data sets • monitoring and analytics 4
  • 5. What is special about Reactive Streams?
  • 6. Reactive  Applications The Four Reactive Traits 6 http://reactivemanifesto.org/
  • 7. Needed: Asynchrony • Resilience demands it: • encapsulation • isolation • Scalability demands it: • distribution across nodes • distribution across cores 7
  • 8. Many Kinds of Async Boundaries 8
  • 9. Many Kinds of Async Boundaries • between different applications 8
  • 10. Many Kinds of Async Boundaries • between different applications • between network nodes 8
  • 11. Many Kinds of Async Boundaries • between different applications • between network nodes • between CPUs 8
  • 12. Many Kinds of Async Boundaries • between different applications • between network nodes • between CPUs • between threads 8
  • 13. Many Kinds of Async Boundaries • between different applications • between network nodes • between CPUs • between threads • between actors 8
  • 14. The Problem: ! Getting Data across an Async Boundary
  • 16. Possible Solutions • the Traditional way: blocking calls 10
  • 18. Possible Solutions ! • the Push way: buffering and/or dropping 11
  • 20. Possible Solutions ! ! • the Reactive way:
 non-blocking & non-dropping & bounded 12
  • 21. How do we achieve that?
  • 22. Supply and Demand • data items flow downstream • demand flows upstream • data items flow only when there is demand • recipient is in control of incoming data rate • data in flight is bounded by signaled demand 14 Publisher Subscriber data demand
  • 23. Dynamic Push–Pull • “push” behavior when consumer is faster • “pull” behavior when producer is faster • switches automatically between these • batching demand allows batching data 15 Publisher Subscriber data demand
  • 24. Explicit Demand: Tailored Flow Control 16 demand data splitting the data means merging the demand
  • 25. Explicit Demand: Tailored Flow Control 17 merging the data means splitting the demand
  • 26. Reactive Streams • asynchronous non-blocking data flow • asynchronous non-blocking demand flow • minimal coordination and contention • message passing allows for distribution • across applications • across nodes • across CPUs • across threads • across actors 18
  • 28. What is a Collection? 20
  • 29. What is a Collection? • Oxford Dictionary: • “a group of things or people” 20
  • 30. What is a Collection? • Oxford Dictionary: • “a group of things or people” • wikipedia: • “a grouping of some variable number of data items” 20
  • 31. What is a Collection? • Oxford Dictionary: • “a group of things or people” • wikipedia: • “a grouping of some variable number of data items” • backbone.js: • “collections are simply an ordered set of models” 20
  • 32. What is a Collection? • Oxford Dictionary: • “a group of things or people” • wikipedia: • “a grouping of some variable number of data items” • backbone.js: • “collections are simply an ordered set of models” • java.util.Collection: • definite size, provides an iterator, query membership 20
  • 33. User Expectations • an Iterator is expected to visit all elements
 (especially with immutable collections) • x.head + x.tail == x • the contents does not depend on who is processing the collection • the contents does not depend on when the processing happens
 (especially with immutable collections) 21
  • 34. Streams have Unexpected Properties • the observed sequence depends on • … when the observer subscribed to the stream • … whether the observer can process fast enough • … whether the streams flows fast enough 22
  • 35. Streams are not Collections! • java.util.stream:
 Stream is not derived from Collection
 “Streams differ from Coll’s in several ways” • no storage • functional in nature • laziness seeking • possibly unbounded • consumable 23
  • 36. Streams are not Collections! • a collection can be streamed • a stream observer can create a collection • … but saying that a Stream is just a lazy Collection evokes the wrong associations 24
  • 37. So, Reactive Streams: why not just java.util.stream.Stream?
  • 38. Java 8 Stream 26 import java.util.stream.*; ! // get some stream final Stream<Integer> s = Stream.of(1, 2, 3); // describe transformation final Stream<String> s2 = s.map(i -> "a" + i); // make a pull collection s2.iterator(); // or alternatively push it somewhere s2.forEach(i -> System.out.println(i)); // (need to pick one, Stream is consumable)
  • 39. Java 8 Stream • provides a DSL for describing transformation • introduces staged computation
 (but does not allow reuse) • prescribes an eager model of execution • offers either push or pull, chosen statically 27
  • 41. RxJava 29 import rx.Observable; import rx.Observable.*; ! // get some stream source final Observable<Integer> obs = range(1, 3); // describe transformation final Observable<String> obs2 = obs.map(i -> "b" + i); // and use it twice obs2.subscribe(i -> System.out.println(i)); obs2.filter(i -> i.equals("b2")) .subscribe(i -> System.out.println(i));
  • 42. RxJava • implements pure “push” model • includes extensive DSL for transformations • only allows blocking for back pressure • currently uses unbounded buffering for crossing an async boundary • work on distributed Observables sparked participation in Reactive Streams 30
  • 44. Participants • Engineers from • Netflix • Oracle • Pivotal • Red Hat • Twitter • Typesafe • Individuals like Doug Lea and Todd Montgomery 32
  • 45. The Motivation • all participants had the same basic problem • all are building tools for their community • a common solution benefits everybody • interoperability to make best use of efforts • e.g. use Reactor data store driver with Akka transformation pipeline and Rx monitoring to drive a vert.x REST API (purely made up, at this point) 33 see also Jon Brisbin’s post on “Tribalism as a Force for Good”
  • 46. Recipe for Success • minimal interfaces • rigorous specification of semantics • full TCK for verification of implementation • complete freedom for many idiomatic APIs 34
  • 47. The Meat 35 trait Publisher[T] { def subscribe(sub: Subscriber[T]): Unit } trait Subscription { def requestMore(n: Int): Unit def cancel(): Unit } trait Subscriber[T] { def onSubscribe(s: Subscription): Unit def onNext(elem: T): Unit def onError(thr: Throwable): Unit def onComplete(): Unit }
  • 48. The Sauce • all calls on Subscriber must dispatch async • all calls on Subscription must not block • Publisher is just there to create Subscriptions 36
  • 49. How does it Connect? 37 SubscriberPublisher subscribe onSubscribeSubscription requestMore onNext
  • 51. Akka Streams • powered by Akka Actors • execution • distribution • resilience • type-safe streaming through Actors with bounded buffering 39
  • 52. Basic Akka Example 40 implicit val system = ActorSystem("Sys") val mat = FlowMaterializer(...) ! Flow(text.split("s").toVector). map(word => word.toUpperCase). foreach(tranformed => println(tranformed)). onComplete(mat) { case Success(_) => system.shutdown() case Failure(e) => println("Failure: " + e.getMessage) system.shutdown() }
  • 53. More Advanced Akka Example 41 val s = Source.fromFile("log.txt", "utf-8") Flow(s.getLines()). groupBy { case LogLevelPattern(level) => level case other => "OTHER" }. foreach { case (level, producer) => val out = new PrintWriter(level+".txt") Flow(producer). foreach(line => out.println(line)). onComplete(mat)(_ => Try(out.close())) }. onComplete(mat)(_ => Try(s.close()))
  • 54. Java 8 Example 42 final ActorSystem system = ActorSystem.create("Sys"); final MaterializerSettings settings = MaterializerSettings.create(); final FlowMaterializer materializer = FlowMaterializer.create(settings, system); ! final String[] lookup = { "a", "b", "c", "d", "e", "f" }; final Iterable<Integer> input = Arrays.asList(0, 1, 2, 3, 4, 5); ! Flow.create(input).drop(2).take(3). // leave 2, 3, 4 map(elem -> lookup[elem]). // translate to "c","d","e" filter(elem -> !elem.equals("c")). // filter out the "c" grouped(2). // make into a list mapConcat(list -> list). // flatten the list fold("", (acc, elem) -> acc + elem). // accumulate into "de" foreach(elem -> System.out.println(elem)). // print it consume(materializer);
  • 55. Akka TCP Echo Server 43 val future = IO(StreamTcp) ? Bind(addr, ...) future.onComplete { case Success(server: TcpServerBinding) => println("listen at "+server.localAddress) ! Flow(server.connectionStream).foreach{ c => println("client from "+c.remoteAddress) c.inputStream.produceTo(c.outputStream) }.consume(mat) ! case Failure(ex) => println("cannot bind: "+ex) system.shutdown() }
  • 56. Akka HTTP Sketch (NOT REAL CODE) 44 val future = IO(Http) ? RequestChannelSetup(...) future.onSuccess { case ch: HttpRequestChannel => val p = ch.processor[Int] val body = Flow(new File(...)).toProducer(mat) Flow(HttpRequest(method = POST, uri = "http://ex.amp.le/42", entity = body) -> 42) .produceTo(mat, p) Flow(p).map { case (resp, token) => val out = FileSink(new File(...)) Flow(resp.entity.data).produceTo(mat, out) }.consume(mat) }
  • 58. Current State • Early Preview is available:
 "org.reactivestreams" % "reactive-streams-spi" % "0.2"
 "com.typesafe.akka" %% "akka-stream-experimental" % "0.3" • check out the Activator template
 "Akka Streams with Scala!"
 (https://github.com/typesafehub/activator-akka-stream-scala) 46
  • 59. Next Steps • we work towards inclusion in future JDK • try it out and give feedback! • http://reactive-streams.org/ • https://github.com/reactive-streams 47
  • 60. ©Typesafe 2014 – All Rights Reserved