Akka Streams如何用OrElse编写GraphStage

时间:2017-09-19 14:13:59

标签: scala akka-stream

我有以下要求。我正在编写一个需要查找SQL表(在不同的数据库中)的GraphStage。如果该查找失败,那么它应该只查找第二个表(在不同的数据库中),如果该查找也失败,则在第3个表中查找(在不同的表中)。如果所有查找都失败,则使用默认

我用Google搜索,发现了这个

http://doc.akka.io/japi/akka/current/akka/stream/scaladsl/OrElse.html

还有这个thead

Alternative flows based on condition for akka stream

但广播和分区不是我想要的。我不想同时查找两个表。我想要的是,如果一个流返回None,则只有第二个流用于获取值。

现在我做了类似的事情

val flow = Flow[Foo].map{foo => 
    lookup1(foo.id) orElse lookup2(foo.id) getOrElse default
}

但是这使得上面的流程非常单一。如果我可以将上面的流程分成3个单独的流程,然后通过我的graphstage中的orelse子句连接它们将会很好。

1 个答案:

答案 0 :(得分:1)

使用flatMapConcat和orElse可能会帮助您根据要组合的源数量使代码更通用。见下面的例子

  val altFlows: List[Flow[Foo, Option[Bar], NotUsed]] = ???
  val default : Bar = ???

  Flow[Foo].flatMapConcat { foo ⇒
    val altSources = altFlows.map(Source.single(foo).via(_).collect{ case Some(x) ⇒ x })
    val default    = Source.single(default)

    (altSources :+ default).reduce(_ orElse _)
  }