Как вернуть значение из планировщика - PullRequest
0 голосов
/ 31 октября 2019

Я хотел бы периодически обновлять значение (используется позже) внутри 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}

Ответы [ 2 ]

3 голосов
/ 31 октября 2019

Я думаю, вы хотите что-то вроде этого:

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())
  })
}
0 голосов
/ 31 октября 2019

Вы можете смоделировать это с помощью актера:

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 заставит актера отправить себе сообщение DoTask, а затем вы можете получить текущее состояние, отправив сообщение.

...