使用Akka流进行一对多合并

使用Akka流进行一对多合并,akka,akka-stream,Akka,Akka Stream,我有一个用例,其中有一个要从数据库中获取的值列表和一个需要获取值的日期列表。我想使用akka流(流或带有GraphDSL的源)在它们之间建立一对多(或多对一)关系,以便获取每个日期的每个值 比如说, 动物=牛、山羊、绵羊 年份=2018年、2019年 预期的流输出为 cow&2018 山羊与2018 绵羊与2018 cow&2019 山羊与2019 sheep&2019如果您想要这样的产品,您不需要图形DSL def animalsAndYears(animals: Source[Animal,

我有一个用例,其中有一个要从数据库中获取的值列表和一个需要获取值的日期列表。我想使用akka流(流或带有GraphDSL的源)在它们之间建立一对多(或多对一)关系,以便获取每个日期的每个值

比如说,

动物=牛、山羊、绵羊

年份=2018年、2019年

预期的流输出为

cow&2018

山羊与2018

绵羊与2018

cow&2019

山羊与2019


sheep&2019

如果您想要这样的产品,您不需要图形DSL

def animalsAndYears(animals: Source[Animal, NotUsed], years: Source[Year, NotUsed]): Source[(Animal, Year), NotUsed] =
  years.flatMapConcat { year =>
    animals.map { animal =>
      animal -> year
    }
  }
因此:

会给你一系列的
动物
年份
元组。假设您有一个函数:

 def queryDBForAnimalYear(aandy: (Animal, Year)): Future[Seq[Row]] = ???
然后,您可以使用以下命令获得行流:

val parallelism: Int = ??? // How many queries to have in-flight at a time
animalsAndYears(Source(listOfAnimals), Source(listOfYears))
  .mapAsync(parallelism) { params => queryDBForAnimalYear(params) }
  .mapConcat(identity)  // gives you a Source[Row]
val parallelism: Int = ??? // How many queries to have in-flight at a time
animalsAndYears(Source(listOfAnimals), Source(listOfYears))
  .mapAsync(parallelism) { params => queryDBForAnimalYear(params) }
  .mapConcat(identity)  // gives you a Source[Row]