是否可以在不触发“子流不能多次实现”的情况下缓存源并重用它?
我正在执行流连接,这需要为左侧的每个元素调用微服务。该调用返回要加入的记录流。我想缓存源,以便对微服务的相同调用导致缓存的流。但是我正在执行的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, _))
}
答案 0 :(得分:1)
Source
表示潜在的巨大数据流,甚至是无限的数据流。它被设计为只能像Iterator
一样被遍历一次。如果您确实希望重用源的内容,则必须将其收集到常规数据结构中,例如Seq
。
因此,您的缓存将为util.HashMap[AnyRef, Seq[Array[AnyRef], Any]]
类型。