首页 > 解决方案 > akka http:服务器绑定未按预期运行

问题描述

我有以下代码:

val serverSource = Http().bind("localhost", 8080)
val connectionSink = Sink.foreach[IncomingConnection] {
    connection => println(s"Accepted incoming connection from ${connection.remoteAddress}")
  }
val serverBindingFuture = serverSource.to(connectionSink).run()
serverBindingFuture.onComplete {
    case Success(binding) => {
      println("Server binding successful")
      binding.terminate(10 seconds)
    }
    case Failure(ex) => println(s"Server binding failed $ex")
}

正如代码段所说,我将在 10 秒后终止服务器绑定。所以我希望如果我在此期限到期之前发送请求,我应该得到消息“接受来自...的传入连接”。

但我观察到我总是收到“无法访问此站点”,并且从未打印过消息。

标签: akka-http

解决方案


正如代码段所说,我将在 10 秒后终止服务器绑定。所以我希望如果我在此期限到期之前发送请求,我应该得到消息“接受来自...的传入连接”。

你误解了terminate. 持续时间参数是关闭的期限,而不是表示服务器将在此之前继续接受请求。

这是对您的代码的调整以证明这一点。

  • 服务器启动后立即打印Server binding successful,并在调用前等待 10 秒terminate
  • Starting shutdown在调用之前打印并在完成后立即terminate打印Finished shutdownterminate

你应该看到:

  • curl 'http://localhost:8080/api触发println直到Starting shutdown出现
  • Starting shutdown和之间的延迟Finished shutdown可能很短(比 10 秒短得多)
val serverSource = Http().bind("localhost", 8080)
val connectionSink = Sink.foreach[IncomingConnection] {
  connection => println(s"Accepted incoming connection from ${connection.remoteAddress}")
}
val serverBindingFuture = serverSource.to(connectionSink).run()
serverBindingFuture.onComplete {
  case Success(binding) => {
    println("Server binding successful")
    system.scheduler.scheduleOnce(10 seconds) {
      println("Starting shutdown")
      binding.terminate(10 seconds).onComplete { termOutcome =>
        println(s"Finished shutdown $termOutcome")
      }
    }
  }
  case Failure(ex) => println(s"Server binding failed $ex")
}

推荐阅读