2

内部にグラフを作成してカスタム シンクを作成しています。これは、私の質問を示すために私のコードを大幅に簡略化したものです。

def mySink: Sink[Int, Unit] = Sink() { implicit builder =>

    val entrance = builder.add(Flow[Int].buffer(500, OverflowStrategy.backpressure))
    val toString = builder.add(Flow[Int, String, Unit].map(_.toString))
    val printSink = builder.add(Sink.foreach(elem => println(elem)))

    builder.addEdge(entrance.out, toString.in)
    builder.addEdge(toString.out, printSink.in)

    entrance.in
}

私が抱えている問題は、次のような単一の型引数と値引数なしで同じ入力/出力型の Flow を作成することは有効ですが、Flow[Int](これはドキュメント全体にあります) 2 つだけを指定することは有効ではありません。型パラメーターとゼロ値パラメーター。

Flow オブジェクトのリファレンス ドキュメントによると、apply探しているメソッドは次のように定義されています。

def apply[I, O]()(block: (Builder[Unit]) ⇒ (Inlet[I], Outlet[O])): Flow[I, O, Unit]

と言う

指定された create 関数に FlowGraph.Builder を渡すことで Flow を作成します。

create 関数は、作成された Flow の入力ポートと出力ポートに対応する Inlet と Outlet のペアを返すことが期待されます。

非常に単純なフローだと思うものを作成しようとすると、別のレベルのグラフビルダーに対処する必要があるようです。内部ポートをいじる必要のない入力と出力のタイプを変更する Flow を作成する、より簡単で簡潔な方法はありますか? これがこの問題にアプローチする正しい方法である場合、解決策はどのようになりますか?

ボーナス: 入力の型を出力から変更しないフローを簡単に作成できるのはなぜですか?

4

1 に答える 1

3

フローの入力タイプと出力タイプの両方を指定する場合は、ドキュメントにある apply メソッドを実際に使用する必要があります。ただし、それを使用することは、すでに行ったのとほぼ同じです。

Flow[String, Message]() { implicit b =>
  import FlowGraph.Implicits._

  val reverseString = b.add(Flow[String].map[String] { msg => msg.reverse })
  val mapStringToMsg = b.add(Flow[String].map[Message]( x => TextMessage.Strict(x)))

  // connect the graph
  reverseString ~> mapStringToMsg

  // expose ports
  (reverseString.inlet, mapStringToMsg.outlet)
}

インレットを返すだけでなく、インレットとアウトレットのタプルを返します。このフローは、特定の Source または Sink で (たとえば、別のビルダー内で、または直接 runWith で) 使用できるようになりました。

于 2015-05-23T08:19:27.193 に答える