Scala 如何从调度程序返回值
我想在akka http服务器内定期更新一个值(稍后使用),我找到的唯一方法是使用调度程序,但我无法从中返回值 我试过使用akka调度程序,我可能应该使用Future,但不知道如何使用 关键是更新值时不要重新启动http服务器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
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在调度程序之外,并且你的方法没有返回更新的结果。你能提供一些关于我如何使用此类类的详细信息吗?