如何 return 来自调度程序的值

How to return value from scheduler

我想在 akka http 服务器中定期更新一个值(稍后使用),我找到的唯一方法是使用调度程序,但我无法 return 从中获取一个值。

我尝试过使用 akka 调度程序,我也许应该使用 Future,但不知道如何使用。

重点是更新值时不要重启http服务器

def initializeWebServer(interface : String, port : Int) = {

system.scheduler.schedule(0 seconds, 10 seconds){
 val result = /***/
}


val route: Route =
  concat(
    get{
      path("getResult"){
        complete(result)
      }
    }
  )

val bindingFuture = Http().bindAndHandle(route, interface, port.toInt)
println(s"Server online at http://$interface:$port/")

CoordinatedShutdown(system).addJvmShutdownHook({
  bindingFuture
    .flatMap(_.unbind())
})


}

我想要的是:

val result = schedule( 10 sec){do something and return result}

我想你想要这样的东西:

var result = 0
val cancellable = scheduler.schedule(0.seconds, 10.seconds) {
  result = result + 1
}

您可以使用 cancellable 值在不再需要时停止计划。


完整代码如下:

def initializeWebServer(interface: String, port: Int) = {

  var result = 0
  val canceallable = context.system.scheduler.schedule(0.seconds, 10.seconds) {
    result = result + 1
  }

  val route: Route =
    concat(
      get {
        path("getResult") {
          complete(result)
        }
      }
    )

  val bindingFuture = Http().bindAndHandle(route, interface, port.toInt)
  println(s"Server online at http://$interface:$port/")

  CoordinatedShutdown(system).addJvmShutdownHook({
    bindingFuture
      .flatMap(_.unbind())
  })
}

您可以使用演员对此进行建模:

class StateHolder extends Actor {

  val state = ???

  context.system.scheduler.schedule(0.second, 10.second, self, DoTask)

  def receive = {
    case DoTask   => /* update state */
    case GetState => /* fetch state */
  }
}

scheduler 会导致 actor 向自己发送 DoTask 消息,然后您可以通过发送消息来获取当前状态。