pekko/akka-docs/rst/scala/code/docs/stream/cookbook/RecipeWorkerPool.scala

49 lines
1.3 KiB
Scala
Raw Normal View History

2014-12-08 17:29:40 +01:00
package docs.stream.cookbook
import akka.stream.FlowShape
2014-12-08 17:29:40 +01:00
import akka.stream.scaladsl._
import akka.testkit.TestProbe
import scala.concurrent.Await
import scala.concurrent.duration._
class RecipeWorkerPool extends RecipeSpec {
"Recipe for a pool of workers" must {
"work" in {
val myJobs = Source(List("1", "2", "3", "4", "5"))
type Result = String
val worker = Flow[String].map(_ + " done")
//#worker-pool
def balancer[In, Out](worker: Flow[In, Out, Any], workerCount: Int): Flow[In, Out, Unit] = {
import GraphDSL.Implicits._
2014-12-08 17:29:40 +01:00
Flow.fromGraph(GraphDSL.create() { implicit b =>
val balancer = b.add(Balance[In](workerCount, waitForAllDownstreams = true))
val merge = b.add(Merge[Out](workerCount))
2014-12-08 17:29:40 +01:00
for (_ <- 1 to workerCount) {
// for each worker, add an edge from the balancer to the worker, then wire
// it to the merge element
balancer ~> worker ~> merge
}
FlowShape(balancer.in, merge.out)
})
2014-12-08 17:29:40 +01:00
}
val processedJobs: Source[Result, Unit] = myJobs.via(balancer(worker, 3))
2014-12-08 17:29:40 +01:00
//#worker-pool
Await.result(processedJobs.grouped(10).runWith(Sink.head), 3.seconds).toSet should be(Set(
2014-12-08 17:29:40 +01:00
"1 done", "2 done", "3 done", "4 done", "5 done"))
}
}
}