我有以下要求。我正在编写一个需要查找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子句连接它们将会很好。
答案 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 _)
}