如何从类内部使递归akka流“可切换”

时间:2018-11-08 14:38:49

标签: scala akka akka-stream

我有一个具有无限流的类,其定义如下:

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功能可能会有更多惯用的解决方案。您可以提出另一种解决此问题的方法吗?

1 个答案:

答案 0 :(得分:1)

使用Valve中的Akka Streams Contrib project

  

将其材料化为ValveSwitch的未来,它提供了一种方法翻转,可以停止或重新启动通过该阶段的元素流。只要阀门关闭,它就会背压。

ValveSpec中找到了其用法示例。