关闭 Akka HTTP 应用程序
Shut down Akka HTTP app
我有一个 运行 Akka HTTP 应用程序,我想关闭它。
对我来说 does not work 在 SBT does not work 中按 Ctrl + C(我的 shell 目前是 Git Bash 对于 Windows).
推荐的优雅关闭 Akka 应用程序的方法是什么?
从 this thread 中获得灵感,我向我的应用程序添加了一个关闭应用程序的路由:
def shutdownRoute: Route = path("shutdown") {
Http().shutdownAllConnectionPools() andThen { case _ => system.terminate() }
complete("Shutting down app")
}
其中 system
是应用的 ActorSystem。
鉴于此路线,我现在可以使用
关闭我的应用程序
curl http://localhost:5000/shutdown
编辑:
能够远程关闭服务器对于生产代码来说不是一个好主意。在评论中,Henrik 指出了通过在 SBT 控制台中按 Enter 来关闭服务器的另一种方式:
StdIn.readLine()
// Unbind from the port and shut down when done
bindingFuture
.flatMap(_.unbind())
.onComplete(_ => system.terminate())
对于上下文,我把上面的代码放在服务器初始化的最后:
// Gets the host and a port from the configuration
val host = system.settings.config.getString("http.host")
val port = system.settings.config.getInt("http.port")
implicit val materializer = ActorMaterializer()
// bindAndHandle requires an implicit ExecutionContext
implicit val ec = system.dispatcher
import akka.http.scaladsl.server.Directives._
val route = path("hi") {
complete("How's it going?")
}
// Starts the HTTP server
val bindingFuture: Future[ServerBinding] =
Http().bindAndHandle(route, host, port)
val log = Logging(system.eventStream, "my-application")
bindingFuture.onComplete {
case Success(serverBinding) =>
log.info(s"Server bound to ${serverBinding.localAddress}")
case Failure(ex) =>
log.error(ex, "Failed to bind to {}:{}!", host, port)
system.terminate()
}
log.info("Press enter key to stop...")
// Let the application run until we press the enter key
StdIn.readLine()
// Unbind from the port and shut down when done
bindingFuture
.flatMap(_.unbind())
.onComplete(_ => system.terminate())
我有一个 运行 Akka HTTP 应用程序,我想关闭它。
对我来说 does not work 在 SBT does not work 中按 Ctrl + C(我的 shell 目前是 Git Bash 对于 Windows).
推荐的优雅关闭 Akka 应用程序的方法是什么?
从 this thread 中获得灵感,我向我的应用程序添加了一个关闭应用程序的路由:
def shutdownRoute: Route = path("shutdown") {
Http().shutdownAllConnectionPools() andThen { case _ => system.terminate() }
complete("Shutting down app")
}
其中 system
是应用的 ActorSystem。
鉴于此路线,我现在可以使用
关闭我的应用程序curl http://localhost:5000/shutdown
编辑:
能够远程关闭服务器对于生产代码来说不是一个好主意。在评论中,Henrik 指出了通过在 SBT 控制台中按 Enter 来关闭服务器的另一种方式:
StdIn.readLine()
// Unbind from the port and shut down when done
bindingFuture
.flatMap(_.unbind())
.onComplete(_ => system.terminate())
对于上下文,我把上面的代码放在服务器初始化的最后:
// Gets the host and a port from the configuration
val host = system.settings.config.getString("http.host")
val port = system.settings.config.getInt("http.port")
implicit val materializer = ActorMaterializer()
// bindAndHandle requires an implicit ExecutionContext
implicit val ec = system.dispatcher
import akka.http.scaladsl.server.Directives._
val route = path("hi") {
complete("How's it going?")
}
// Starts the HTTP server
val bindingFuture: Future[ServerBinding] =
Http().bindAndHandle(route, host, port)
val log = Logging(system.eventStream, "my-application")
bindingFuture.onComplete {
case Success(serverBinding) =>
log.info(s"Server bound to ${serverBinding.localAddress}")
case Failure(ex) =>
log.error(ex, "Failed to bind to {}:{}!", host, port)
system.terminate()
}
log.info("Press enter key to stop...")
// Let the application run until we press the enter key
StdIn.readLine()
// Unbind from the port and shut down when done
bindingFuture
.flatMap(_.unbind())
.onComplete(_ => system.terminate())