7

Flow私のプログラムには、並行して処理したいいくつかの があります。すべてが完了したら、何らかのアクションをトリガーしたいと思います。

これを行う 1 つの方法は、各完了後にアクターにメッセージを送信することです。アクターがすべてのフローの準備ができていることを確認すると、アクションをトリガーできます。

akka-streams Scala DSL 内に、見落としている可能性のあるもので、さらに簡単にするものがあるかどうか疑問に思っていました。

EDIT : ドキュメントに記載されているように、Future はストリームで発生した最初のイベントの直後に完了するため、Flow を Future に変換することはできません。次のコードを実行します。

implicit val system = ActorSystem("Sys")
val fm = FlowMaterializer(MaterializerSettings())

def main(args: Array[String]): Unit = {
  val fut = Flow(1 second, {() => println("tick")}).toFuture(fm)

  fut.onComplete{ _ =>
    println("future completed")
  }
}

「tick」、「future completed」、そして「tick」の無限のシーケンスが続きます。

4

2 に答える 2

9

コメントで述べたように、@Eduardo は を に変換することについて正しいと思いFlowますFuture。次の例を検討してください。

implicit val system = ActorSystem("Sys")
import system.dispatcher

val text1 = 
  """hello1world
  foobar""".stripMargin

val text2 = 
  """this1is
  a1test""".stripMargin

def flowFut(text:String) = Flow(text.split("\\s").toVector)
  .map(_.toUpperCase())
  .map(_.replace("1", ""))
  .toFuture(FlowMaterializer(MaterializerSettings()))    


val fut1 = flowFut(text1)    
val fut2 = flowFut(text2)    
val fut3 = for{
  f1 <- fut1
  f2 <- fut2
} yield {
  s"$f1, $f2"
}

fut3 foreach {println(_)}

ここでは、テキスト行の各セットに対して 2 つの個別の変換を実行し、upper に変換し、すべてのテキストから #1 を削除します。次に、この結果を に強制して、結果を新しい に構成し、Flowそれを印刷します。 FutureFuture

于 2014-08-16T12:41:41.627 に答える