2016-03-05 13 views
13

akkaストリーミングでtoMatは何を理解しようとしています。たとえば:akkaストリームtoMat

val sink1:Sink[Int, Future[Int]]=Sink.fold[Int,Int](0)(_ + _) 

val flow=Flow[Int].fold[Int](0){(x,y)=> x+y} 

val runnable = Source (1 to 10).viaMat(flow)(Keep.right).toMat(sink1)(Keep.both) 
  1. を介した対viaMatの使用は何ですか?
  2. viaMatとtoMatの間にtoMatは何をしていますか?
  3. keep.bothの使い方は、以前のものと現在のものとの間に価値があることを意味しますか?はいの場合、それらの値をどのように戻すことができますか?

おかげ アルン

+0

から取得することができたいくつかの詳細:RunnableGraph [(約束[オプション[INT]]、フューチャー[ (Keep.both).run() – ASe

答えて

12
  1. 経由でviaMat(...)(Keep.left)のためだけのショートカットで、実際に、これはそれが実現しています方法です:override def via[T, Mat2](flow: Graph[FlowShape[Out, T], Mat2]): Repr[T] = viaMat(flow)(Keep.left)

  2. toMat viaMatと同じですがシンクの場合は、左側(ソース/フロー)または右側(シンク)側または両方からマテリアライズされた値を保持できます。

  3. Keep.bothはちょうど(a:A,b:B) => (a, b)の2つの入力パラメータをタプルとして返す関数です。私は、コードのあなたのラインを切り裂くます

二つの流れ合成する際、左右両側のマテリアライズド値を持っている(またはソースをして流れたり流れ、などシンク)するために使用されます:

// you're keeping the materialized value of flow 
val source2 = Source (1 to 10).viaMat(flow)(Keep.right) 
// you're keeping both materialized values, i.e. the one of flow from previous step 
// and the one o sink.  
val runnableGraph = source2.toMat(sink)(Keep.both) 
runnableGraph.run() // returns a tuple (flowMatVal, sinkMatVal) 

フローの2つの部分(つまり、ソースとフロー/シンク、フローとシンク)を結合すると、フローの実行時に得られるマテリアライズされた値がそれぞれの値になります。 via/toと組み合わせるときのデフォルトの動作は、左側を維持しています。 viaMat/toMatを使用する場合、正しいマテリアライズされた値を保持するか、または両方をタプルとして保持するかを選択できます。

+0

ありがとうございました。私はマテリアライズドな価値を理解することができません、私はソースを正確に1つの出力を知っていると正確に1つの入力をシンクし、ここでマットは何ですか? 次のコードは、あなたが、私はそれらを印刷することができますどのように私を助けることができる...正しい私のタプルを返すこととします ヴァルソース1 =ソース(1から10) ヴァル・シンク:シンク[INT、フューチャー[INT]] = Sink.fold [Int、Int](0)(_ + _) val runnableGraph = source1.toMat(sink.both) val x = runnableGraph.run() – ASe

+0

あなたがrunnableGraph.run()を実行するとき。たとえば、Sink.foldを使用している場合、それはフォールディングの結果を含む未来です。これを読んでください:http://doc.akka.io/docs/akka/2.4.2/general/stream/stream-design.html –

+0

ありがとう。 のマテリアライズ値http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/stream-quickstart.html#materialized-values 私が正しく理解していれば - Source [+ Out、+ Mat]、Flow [-In、+ Out、+ Mat]およびSink [-In、+ Mat]のマットタイプパラメータは実行時です。 – ASe