用非akka系统的喷雾关闭akka系统

时间:2016-04-19 14:49:33

标签: scala akka spray

我对scala中的akka​​和期货非常新。我使用spray来获取URL的输出并将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

2 个答案:

答案 0 :(得分:0)

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

system.terminate()

而是等待这样的终止(例子)

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

答案 1 :(得分:0)

上面的答案并没有最终为我工作所以我不得不通过在调用shutdown方法之前为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()

}