=str #16787 java cookbook

This commit is contained in:
Konrad Malawski 2015-07-08 10:23:10 +03:00 committed by Martynas Mickevičius
parent 708d7017f2
commit c0e52338df
7 changed files with 413 additions and 66 deletions

View file

@ -19,7 +19,8 @@ class RecipeGlobalRateLimit extends RecipeSpec {
case object ReplenishTokens
def props(maxAvailableTokens: Int, tokenRefreshPeriod: FiniteDuration, tokenRefreshAmount: Int): Props =
def props(maxAvailableTokens: Int, tokenRefreshPeriod: FiniteDuration,
tokenRefreshAmount: Int): Props =
Props(new Limiter(maxAvailableTokens, tokenRefreshPeriod, tokenRefreshAmount))
}

View file

@ -22,16 +22,16 @@ class RecipeKeepAlive extends RecipeSpec {
val sink = Sink(sub)
//#inject-keepalive
val keepAliveStream: Source[ByteString, Unit] = ticks
val tickToKeepAlivePacket: Flow[Tick, ByteString, Unit] = Flow[Tick]
.conflate(seed = (tick) => keepaliveMessage)((msg, newTick) => msg)
val graph = FlowGraph.closed() { implicit builder =>
import FlowGraph.Implicits._
val unfairMerge = builder.add(MergePreferred[ByteString](1))
dataStream ~> unfairMerge.preferred
// If data is available then no keepalive is injected
keepAliveStream ~> unfairMerge ~> sink
dataStream ~> unfairMerge.preferred
ticks ~> tickToKeepAlivePacket ~> unfairMerge ~> sink
}
//#inject-keepalive

View file

@ -1,6 +1,6 @@
package docs.stream.cookbook
import akka.stream.scaladsl.{ Sink, Source }
import akka.stream.scaladsl._
import akka.stream.testkit._
import scala.concurrent.duration._
@ -18,13 +18,12 @@ class RecipeMissedTicks extends RecipeSpec {
val sink = Sink(sub)
//#missed-ticks
// tickStream is a Source[Tick]
val missedTicks: Source[Int, Unit] =
tickStream.conflate(seed = (_) => 0)(
val missedTicks: Flow[Tick, Int, Unit] =
Flow[Tick].conflate(seed = (_) => 0)(
(missedTicks, tick) => missedTicks + 1)
//#missed-ticks
missedTicks.to(sink).run()
tickStream.via(missedTicks).to(sink).run()
pub.sendNext(())
pub.sendNext(())

View file

@ -15,19 +15,14 @@ class RecipeMultiGroupBy extends RecipeSpec {
case class Topic(name: String)
val elems = Source(List("1: a", "1: b", "all: c", "all: d", "1: e"))
val topicMapper = { msg: Message =>
val extractTopics = { msg: Message =>
if (msg.startsWith("1")) List(Topic("1"))
else List(Topic("1"), Topic("2"))
}
class X {
//#multi-groupby
val topicMapper: (Message) => immutable.Seq[Topic] = ???
//#multi-groupby
}
//#multi-groupby
val topicMapper: (Message) => immutable.Seq[Topic] = extractTopics
val messageAndTopic: Source[(Message, Topic), Unit] = elems.mapConcat { msg: Message =>
val topicsForMessage = topicMapper(msg)
// Create a (Msg, Topic) pair for each of the topics
@ -35,11 +30,12 @@ class RecipeMultiGroupBy extends RecipeSpec {
topicsForMessage.map(msg -> _)
}
val multiGroups: Source[(Topic, Source[String, Unit]), Unit] = messageAndTopic.groupBy(_._2).map {
case (topic, topicStream) =>
// chopping of the topic from the (Message, Topic) pairs
(topic, topicStream.map(_._1))
}
val multiGroups: Source[(Topic, Source[String, Unit]), Unit] = messageAndTopic
.groupBy(_._2).map {
case (topic, topicStream) =>
// chopping of the topic from the (Message, Topic) pairs
(topic, topicStream.map(_._1))
}
//#multi-groupby
val result = multiGroups.map {

View file

@ -22,8 +22,9 @@ class RecipeParseLines extends RecipeSpec {
//#parse-lines
import akka.stream.io.Framing
val linesStream = rawData.via(
Framing.delimiter(ByteString("\r\n"), maximumFrameLength = 100, allowTruncation = true)).map(_.utf8String)
val linesStream = rawData.via(Framing.delimiter(
ByteString("\r\n"), maximumFrameLength = 100, allowTruncation = true))
.map(_.utf8String)
//#parse-lines
Await.result(linesStream.grouped(10).runWith(Sink.head), 3.seconds) should be(List(