Scala 如何从调度程序返回值

Scala 如何从调度程序返回值,scala,akka,akka-http,Scala,Akka,Akka Http,我想在akka http服务器内定期更新一个值(稍后使用),我找到的唯一方法是使用调度程序,但我无法从中返回值 我试过使用akka调度程序,我可能应该使用Future,但不知道如何使用 关键是更新值时不要重新启动http服务器 def initializeWebServer(interface : String, port : Int) = { system.scheduler.schedule(0 seconds, 10 seconds){ val result = /***/ } v

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

我试过使用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
}
当不再需要时,可以使用
cancelable
值停止计划


以下是完整的代码:

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 */
  }
}

调度程序
将使参与者向自己发送一条
DoTask
消息,然后您可以通过发送消息获取当前状态。

请再考虑一下。。。您希望计划程序定期执行某项任务
a
。。。这意味着这件事会重复多次。。。现在,如果这计算出一个值,这意味着使用这个值的代码
B
也需要定期运行。另一种方法是定期更新一些已经存在的值。是的,定期更新一个值并在外部使用该值是我希望的。问题是,我不希望在更新该值时重新启动服务器。不抱歉,我希望在计划程序外部使用结果。对于您的解决方案,我无法在外部使用更新的结果。它可以工作,但需要一些同步<代码>结果至少应该是易变的@pksimba你能解释一下“外部”是什么意思吗?您可以在路线中的
complete
调用中访问
result
,那么您还想从哪里访问它?@simpadjo我不太明白,您能提供一些详细信息吗?@Tim complete在调度程序之外,并且你的方法没有返回更新的结果。你能提供一些关于我如何使用此类类的详细信息吗?