2014-12-08 17:29:40 +01:00
|
|
|
package docs.stream.cookbook
|
|
|
|
|
|
|
|
|
|
import akka.stream.OverflowStrategy
|
|
|
|
|
import akka.stream.scaladsl._
|
|
|
|
|
import akka.stream.testkit.StreamTestKit.SubscriberProbe
|
|
|
|
|
|
|
|
|
|
import scala.collection.immutable
|
|
|
|
|
import scala.concurrent.Await
|
|
|
|
|
import scala.concurrent.duration._
|
|
|
|
|
|
|
|
|
|
class RecipeDroppyBroadcast extends RecipeSpec {
|
|
|
|
|
|
|
|
|
|
"Recipe for a droppy broadcast" must {
|
|
|
|
|
"work" in {
|
|
|
|
|
val myElements = Source(immutable.Iterable.tabulate(100)(_ + 1))
|
|
|
|
|
|
|
|
|
|
val sub1 = SubscriberProbe[Int]()
|
|
|
|
|
val sub2 = SubscriberProbe[Int]()
|
2015-01-28 14:19:50 +01:00
|
|
|
val futureSink = Sink.head[Seq[Int]]
|
2014-12-08 17:29:40 +01:00
|
|
|
val mySink1 = Sink(sub1)
|
|
|
|
|
val mySink2 = Sink(sub2)
|
2015-01-28 14:19:50 +01:00
|
|
|
val mySink3 = Flow[Int].grouped(200).toMat(futureSink)(Keep.right)
|
2014-12-08 17:29:40 +01:00
|
|
|
|
|
|
|
|
//#droppy-bcast
|
2015-01-28 14:19:50 +01:00
|
|
|
val graph = FlowGraph.closed(mySink1, mySink2, mySink3)((_, _, _)) { implicit b =>
|
|
|
|
|
(sink1, sink2, sink3) =>
|
|
|
|
|
import FlowGraph.Implicits._
|
2014-12-08 17:29:40 +01:00
|
|
|
|
2015-01-28 14:19:50 +01:00
|
|
|
val bcast = b.add(Broadcast[Int](3))
|
|
|
|
|
myElements ~> bcast
|
2014-12-08 17:29:40 +01:00
|
|
|
|
2015-01-28 14:19:50 +01:00
|
|
|
bcast.buffer(10, OverflowStrategy.dropHead) ~> sink1
|
|
|
|
|
bcast.buffer(10, OverflowStrategy.dropHead) ~> sink2
|
|
|
|
|
bcast.buffer(10, OverflowStrategy.dropHead) ~> sink3
|
2014-12-08 17:29:40 +01:00
|
|
|
}
|
|
|
|
|
//#droppy-bcast
|
|
|
|
|
|
2015-01-28 14:19:50 +01:00
|
|
|
Await.result(graph.run()._3, 3.seconds).sum should be(5050)
|
2014-12-08 17:29:40 +01:00
|
|
|
|
|
|
|
|
sub1.expectSubscription().request(10)
|
|
|
|
|
sub2.expectSubscription().request(10)
|
|
|
|
|
|
|
|
|
|
for (i <- 91 to 100) {
|
|
|
|
|
sub1.expectNext(i)
|
|
|
|
|
sub2.expectNext(i)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sub1.expectComplete()
|
|
|
|
|
sub2.expectComplete()
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|