Как получить материализованный результат от Akka Stream Graph?

Я пытаюсь понять, как получить материализованный результат из графика scala Akka Stream.

Я использую "com.typesafe.akka" %% "akka-stream-experimental" % "1.0".

Я просмотрел документы, но смог не найти ни одного примера.

Итак, допустим, у меня есть код

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. Как с этим быть?

Спасибо.


person kikulikov    schedule 15.09.2015    source источник


Ответы (2)


РЕДАКТИРОВАТЬ: Вы можете также посмотреть, как вы создаете поток... Я думаю, что 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

Я думаю, это то, что вы пытаетесь сделать.

EDIT: он также используется в этом приложении чата, которое я нашел (строка 54):

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

person Rich Henry    schedule 15.09.2015

Кажется, что вы не можете сделать это из 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) 
person kikulikov    schedule 16.09.2015