Ваш bindingFuture
завершается в обоих случаях. Если вы держите
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
Затем unbind
и terminate
запускаются, как только сервер прослушивает, что приводит к немедленному завершению работы вашей программы.
Если вы пропустите этот код, то ваша программа продолжит работать, пока все ее потоки не будут завершены. Поскольку система акторов выполняет потоки в фоновом режиме, и вы никогда не завершаете ее, этого никогда не произойдет, и вам придется убить вашу программу, чтобы остановить ее.
Одним из способов постепенного отключения при любом нажатии клавиши является использование этого (взято из официальной документации )
val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
println(s"Server online at http://localhost:8080/\nPress RETURN to stop...")
StdIn.readLine() // let it run until user presses return
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
В этом случае StdIn.readLine()
будет блокировать основной поток до тех пор, пока не будет нажата клавиша, после чего система субъекта и http-сервер будут закрыты.
Если вы хотите дождаться пользовательского «события», а не нажатия клавиши, вы можете просто подождать на пользовательском Future
, например так:
// Just build a Future that will get completed when you want to shutdown
// This can be done manually using a `Promise[Unit]`, but you might also be using
// a library that will give you a Future to wait on.
val myFuture: Future[Unit] = ???
myFuture.flatMap(_ => bindingFuture)
.flatMap(_.unbind())
.onComplete(_ => system.terminate())