AskTimeoutException:在spray-can服务器上停止

时间:2014-06-18 14:12:31

标签: scala akka spray

我正在尝试使用以下代码停止spray-can网络服务器:

implicit val timeout = Timeout(10 seconds)
val future = ask(IO(Http)(system), Http.Unbind(10 second))
Await.result(future, Duration.Inf)

但不幸的是我收到以下异常:

  

[error] AskTimeoutException :: Timed out(AskSupport.scala:334)   [错误]   akka.pattern.PromiseActorRef $$ anonfun $ 1.适用$ MCV $ SP(AskSupport.scala:334)   [错误] akka.actor.Scheduler $$ anon $ 11.run(Scheduler.scala:118)[错误]   akka.actor.LightArrayRevolverScheduler $ TaskHolder.executeTask(Scheduler.scala:455)   [错误]   akka.actor.LightArrayRevolverScheduler $$不久$ 12.executeBucket $ 1(Scheduler.scala:407)   [错误]   akka.actor.LightArrayRevolverScheduler $$匿名$ 12.nextTick(Scheduler.scala:411)   [错误]   akka.actor.LightArrayRevolverScheduler $$匿名$ 12.run(Scheduler.scala:363)

我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是您是将Http.Unbind消息发送给错误的actor(即IO扩展的管理者角色 - 在本例中为Http)。

您必须将Http.Unbind消息发送到HttpListener(这是回复Http.Bind消息且带有Http.Bound消息的actor。以下示例将Http.Bind发送给经理角色,将Http.Unbind发送给HttpListener

class TestActor extends Actor {
  override def preStart = {
    IO(Http) ! Http.Bind(self, interface = "localhost", port = 8080)
  }
  def receive = {
    case Http.Bound(_) => 
      println("bound")
      sender ! Http.Unbind(10 seconds)
    case Http.Unbound =>
      println("unbound")
      context.stop(self)
  }
}

有关更多信息,请参阅documentation部分有关启动和停止的信息。