我有下面的代码,我想知道,为什么当我执行它时,它会立即停止:
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer
import scala.io.StdIn
object WebServer {
def main(args: Array[String]) {
implicit val system = ActorSystem("my-system")
implicit val materializer = ActorMaterializer()
// needed for the future flatMap/onComplete in the end
implicit val executionContext = system.dispatcher
val route =
path("hello") {
get {
complete(HttpEntity(ContentTypes.`text/html(UTF-8)`, "<h1>Say hello to akka-http</h1>"))
}
}
val bindingFuture = Http().bindAndHandle(route, "localhost", 8080)
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
}
}
字符串
正如你所看到的,它是一个简单的Web应用程序,它不应该停止运行。
但是当我删除以下代码时:
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
型
它会一直运行直到我终止它。
问题是,为什么没有
bindingFuture
.flatMap(_.unbind()) // trigger unbinding from the port
.onComplete(_ => system.terminate()) // and shutdown when done
型
申请不会终止吗
1条答案
按热度按时间o4hqfura1#
你的
bindingFuture
在这两种情况下都完成了。字符串
然后,
unbind
和terminate
会在服务器侦听时立即运行,这会导致程序立即完成。如果你忽略了这段代码,那么你的程序会一直运行,直到所有的线程都运行完。因为参与者系统是在后台运行线程的,你从来不会终止它,所以这种情况永远不会发生,你必须杀死你的程序来停止它。
一种在任何按键时都能正常关机的方法是使用这个(取自official documentation)
型
在这种情况下,
StdIn.readLine()
将阻塞主线程,直到按下某个键,此时执行元系统和http服务器将关闭。如果你想等待一个自定义的“事件”而不是一个按键,你可以简单地等待一个自定义的
Future
,如下所示:型