Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Akka讲述如何使用OrElse编写GraphStage_Scala_Akka Stream - Fatal编程技术网

Scala Akka讲述如何使用OrElse编写GraphStage

Scala Akka讲述如何使用OrElse编写GraphStage,scala,akka-stream,Scala,Akka Stream,我有以下要求。我正在写一个GraphStage,它需要查找一个SQL表(在不同的数据库中)。如果该查找失败,则只应查找第二个表(在不同的数据库中),如果该查找也失败,则应查找第三个表(在不同的表中)。如果所有查找都失败,则使用默认值 我在谷歌上找到了这个 还有这个thead 但广播和分区不是我想要的。我不想同时查找这两个表。我想要的是,如果一个流返回None,则只使用第二个流来获取值 现在我做过类似的事情 val flow = Flow[Foo].map{foo => loo

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

我在谷歌上找到了这个

还有这个thead

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

现在我做过类似的事情

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包的私有部分。我认为你的解决方案是你能做的最好的。啊,所以查找不是在第二个表中,而是在第二个数据库中。