我有一个具有无限流的类,其定义如下:
abstract class StreamWrapper() {
def doStuff: Future[Unit] = ???
def recursiveStream(): Unit =
events.mapAsync(parallelism)(doStuff)
.runWith(Sink.fold(???))
.onComplete(
actorSystem.scheduler.scheduleOnce(delay)(recursiveStream())
// ^-- recursion --^
)
}
我将无法通过doStuff
函数关闭/打开此流(在我的情况下,我内部有一个断路器,因此我想通过其回调打开/关闭recursiveStream)。< / p>
解决此问题的最简单方法是引入原子布尔值,在recursiveStream
方法中进行检查并在doStuff
内部进行切换:
abstract class StreamWrapper() {
private val enabled = new AtomicBoolean(true)
def doStuff: Future[Unit] = ??? // toggle enabled here
def recursiveStream(): Unit =
if (enabled)
events.mapAsync(parallelism)(doStuff)
.runWith(Sink.fold(???))
.onComplete(
actorSystem.scheduler.scheduleOnce(delay)(recursiveStream())
)
else log.info("Stream is currently offline...")
}
但是,感觉使用Scala和/或Akka功能可能会有更多惯用的解决方案。您可以提出另一种解决此问题的方法吗?
答案 0 :(得分:1)
使用Valve
中的Akka Streams Contrib project:
将其材料化为ValveSwitch的未来,它提供了一种方法翻转,可以停止或重新启动通过该阶段的元素流。只要阀门关闭,它就会背压。
在ValveSpec
中找到了其用法示例。