2017-11-06 7 views
1

Akkaストリームで次の関数のラッパーを作成しようとしています。汎用パラメータスカラのアクセスタイプパラメータ

RestartFlow.withBackoff(minBackoff = 3.seconds, 
     maxBackoff = 30.seconds, 
     randomFactor = 0.2) { 
    () => s 
    } 

ここで、sはバックオフで折り返しているソースです。この

RetryFlow(s) 

アイブ氏のようなもののような理想的にはidがこれを作成するために管理:

object RetryFlow { 
    def apply[In, Out, _, T <: Flow[In, Out, _]](source: T, minBackoff: FiniteDuration = 3.seconds, maxBackoff: FiniteDuration = 30.seconds, randomFactor: Double = 0.2): Flow[In, Out, NotUsed] = { 
    RestartFlow.withBackoff(
     minBackoff = minBackoff, 
     maxBackoff = maxBackoff, 
     randomFactor = randomFactor) { 
    () => source 
    } 
    } 
} 

問題私は呼び出しサイトで再度フローのすべての3種類のparamsを提供する必要があり、それは恐ろしい見えている

RetryFlow[JustDataEvent, JustDataEvent, NotUsed, Flow[JustDataEvent, JustDataEvent, NotUsed]](s) 

ここでは任意のタイプのパラメータを入力できるため、タイプセーフでもありません。

私は気持ちがいいはずですが、余分なタイプのパラメータをIn/Outではなく、T#In、T#OutなどのようにしてTが流れを拡張するしたがって、私は必要なタイプのパラメータを既に持っています。

答えて

2

Tの代わりに、Flow[In, Out, _]のパラメータを使用するのはどうでしょうか?

object RetryFlow { 
    def apply[In, Out, _](
     source: Flow[In, Out, _], 
     minBackoff: FiniteDuration = 3.seconds, 
     maxBackoff: FiniteDuration = 30.seconds, 
     randomFactor: Double = 0.2): Flow[In, Out, NotUsed] = { 
    RestartFlow.withBackoff[In, Out](minBackoff = minBackoff, 
          maxBackoff = maxBackoff, 
          randomFactor = randomFactor) {() => 
     source 
    } 
    } 
} 

そして、我々が得る:

val value: Flow[Int, String, NotUsed] = Flow.fromFunction[Int, String](i => i.toString) 
RetryFlow(value) 
+1

うんは素晴らしい作品ありがとう、私は私が一般的なのparamとしてフローを取ることによって、間違ったアプローチから、それを見ていたと思います –