我正在尝试使用以下代码停止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)
我做错了什么?
答案 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部分有关启动和停止的信息。