akka http: привязка сервера не работает должным образом - PullRequest
1 голос
/ 28 апреля 2020

У меня следующий код:

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 секунд я прекращаю привязку сервера. Поэтому я ожидаю, что если я отправлю запрос до истечения этого периода, я получу сообщение «Принято входящее соединение от ...».

Но я вижу, что всегда получаю «Этот сайт не может быть достигнут ', и сообщение никогда не печатается.

1 Ответ

1 голос
/ 28 апреля 2020

Как говорит фрагмент, я прекращаю привязку сервера через 10 секунд. Поэтому я ожидаю, что если я отправлю запрос до истечения этого периода, я получу сообщение «Принято входящее соединение от ...».

Вы неправильно поняли семантику terminate. Аргумент длительности - это жесткий крайний срок завершения работы, а не указание на то, что сервер будет продолжать принимать запросы до тех пор.

Вот твик к вашему коду, чтобы продемонстрировать это.

  • напечатайте Server binding successful, как только сервер включится, и подождите 10 секунд, прежде чем вызвать terminate
  • , напечатайте Starting shutdown прямо перед вызовом terminate и напечатайте Finished shutdown, как только terminate завершает

Вы должны увидеть:

  • 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")
}
...