使用来自非 akka 系统的 spray 关闭 akka 系统

Shut down akka system with spray from non akka system

我对 akka 和 scala 中的 futures 还很陌生。我正在使用 spray 将 URL 和 return a Future[String] 的输出输出到另一个对象。这是发出 HTTP 请求的对象。

object ActionsService {

  private implicit val formats = DefaultFormats
  implicit val system = ActorSystem()
  import system.dispatcher

  val pipeline = sendReceive ~> unmarshal[String]
  def getActions: Future[String] ={
     val out = getOutput("http://www.google.com")
    out
  }


  def getOutput(url: String): Future[String] ={
    val response = pipeline (Get (url) )
    response
  }

  def shutdown(code: Int): Unit = {
    IO(Http).ask(Http.CloseAll)(1.second).await
    system.shutdown()
  }
}

这里是我试图关闭 actor 系统的另一个对象中的主要方法。

import ExecutionContext.Implicits.global
def main(args: Array[String]) {
  val test = ActionsService.getActions
test.onComplete {
  case Success(x) => println(x)
  case Failure(y) => println(y)
}
  ActionsService.system.shutdown()

由于某种原因,akka 系统不会关闭。我还尝试使用我的 shutdown 方法关闭 akka 系统,但出现 Exception in thread "main" akka.pattern.AskTimeoutException: Timed out 错误(当调用 shutdown 方法时,也会在 main 方法中发生)。

akka 版本为 2.2.3

您没有指定您使用的 Akka 版本,但在上一个版本中您需要调用

system.terminate()

而是像这样等待终止(举个例子)

Await.ready(system.whenTerminated, Duration.Inf)

上面的答案最终对我不起作用,所以我不得不通过在调用关闭方法之前为 main 方法添加一个睡眠时间来阻塞线程。

def main(args: Array[String]) {
  val test = ActionsService.getActions
  Thread.sleep(700)
test.onComplete {
  case Success(x) => println(x)
  case Failure(y) => println(y)
}
CorporateActionsService.system.shutdown()

}