缓存Akka Substream源并重用它?

时间:2019-03-27 13:12:59

标签: scala akka akka-stream

是否可以在不触发“子流不能多次实现”的情况下缓存源并重用它?

我正在执行流连接,这需要为左侧的每个元素调用微服务。该调用返回要加入的记录流。我想缓存源,以便对微服务的相同调用导致缓存的流。但是我正在执行的flatMapConcat引发“子流不能多次实现”错误。代码如下:

    val cache = new util.HashMap[AnyRef, Source[Array[AnyRef], Any]]()

    inputSource
        .flatMapConcat { record =>
          val key = leftKey(record)
          val rightElemSource = if (cache.containsKey(key)) {
            cache.get(key)
          } else {
            val rightElemSourceInner = doSomethingToGetSource()
            cache.put(key, rightElemSourceInner)
            rightElemSourceInner
          }

          rightElemSource.map(join(record, _))
        }

1 个答案:

答案 0 :(得分:1)

Source表示潜在的巨大数据流,甚至是无限的数据流。它被设计为只能像Iterator一样被遍历一次。如果您确实希望重用源的内容,则必须将其收集到常规数据结构中,例如Seq。 因此,您的缓存将为util.HashMap[AnyRef, Seq[Array[AnyRef], Any]]类型。