Scala Akka讲述如何使用OrElse编写GraphStage
我有以下要求。我正在写一个GraphStage,它需要查找一个SQL表(在不同的数据库中)。如果该查找失败,则只应查找第二个表(在不同的数据库中),如果该查找也失败,则应查找第三个表(在不同的表中)。如果所有查找都失败,则使用默认值 我在谷歌上找到了这个 还有这个thead 但广播和分区不是我想要的。我不想同时查找这两个表。我想要的是,如果一个流返回None,则只使用第二个流来获取值 现在我做过类似的事情Scala Akka讲述如何使用OrElse编写GraphStage,scala,akka-stream,Scala,Akka Stream,我有以下要求。我正在写一个GraphStage,它需要查找一个SQL表(在不同的数据库中)。如果该查找失败,则只应查找第二个表(在不同的数据库中),如果该查找也失败,则应查找第三个表(在不同的表中)。如果所有查找都失败,则使用默认值 我在谷歌上找到了这个 还有这个thead 但广播和分区不是我想要的。我不想同时查找这两个表。我想要的是,如果一个流返回None,则只使用第二个流来获取值 现在我做过类似的事情 val flow = Flow[Foo].map{foo => loo
val flow = Flow[Foo].map{foo =>
lookup1(foo.id) orElse lookup2(foo.id) getOrElse default
}
但这使得上面的流程非常单一。如果我能将上面的流程分解为3个独立的流程,然后在我的graphstage中通过orelse子句将它们连接起来,那就太好了。使用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 _)
}
为什么不把它作为一个SQL查询来编写呢?它们在3个不同的数据库中。
OrElse
似乎是API的私有部分,OrElse
类是akka.stream包的私有部分。我认为你的解决方案是你能做的最好的。啊,所以查找不是在第二个表中,而是在第二个数据库中。