我对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
答案 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()
}