如何从Akka Stream Graph获得物化结果?

时间:2015-09-15 13:55:38

标签: scala akka akka-stream

我试图弄清楚如何从scala Akka Stream图中获得具体化结果。

我正在使用"com.typesafe.akka" %% "akka-stream-experimental" % "1.0"

我查看了docs,但找不到任何示例。

所以,让我们说我有一个代码

val g = FlowGraph.closed() { implicit builder=>
  import FlowGraph.Implicits._

  val in = Source.apply(1 until 10)
  val plus = Flow[Int].map(_ + 10)
  val out = Sink.fold[Seq[Int], Int](Nil){
    case (acc, num) => if (num % 2 == 0) acc :+ num else acc
  }

  in ~> plus ~> out
}

val result = g.run()

我想从图g得到结果,但它返回Unit。如何处理?

谢谢。

2 个答案:

答案 0 :(得分:1)

编辑:你可能也想看看你是如何创建流程的......我认为RunnableGraph可能对你的情况更好,然后run会返回Mat类型。

否则,请尝试查看手册本节中的.mapMaterializedValue(v => ...)来电(特别是第40行):

http://doc.akka.io/docs/akka-stream-and-http-experimental/1.0/scala/stream-flows-and-basics.html#Combining_materialized_values

我认为这就是你要做的事情。

编辑:它也用于我找到的这个聊天应用程序(第54行):

https://github.com/jrudolph/akka-http-scala-js-websocket-chat/blob/master/backend/src/main/scala/example/akkawschat/Chat.scala

答案 1 :(得分:0)

您似乎无法从FlowGraph执行此操作。您需要在外部创建所有流,然后在FlowGraph内使用它们。

val in = Source.apply(1 until 10)
val plus = Flow[Int].map(_ + 10)
val out = Sink.fold[Seq[Int], Int](Nil) {
  case (acc, num) => if (num % 2 == 0) acc :+ num else acc
}

因此,代码看起来像

val g = FlowGraph.closed(in, plus, out)((_, _, _)) { implicit builder => (src, f, dst) =>
  import FlowGraph.Implicits._
  src ~> f ~> dst
}

另一种我发现更简单的方法是

val z = in.via(plus).toMat(out)(Keep.right)