播放:在失败的情况下停止 WebSocket actor

Play: stop WebSocket actor in case of failure

我正在使用 Play 框架和 Akka actors 进行 WebSocket 通信。我正在使用 tryAcceptWithActor 方法:

def socket = WebSocket.tryAcceptWithActor[String, String] { request =>
  Future.successful(request.session.get("user") match {
    case None => Left(Forbidden)
    case Some(_) => Right(MyWebSocketActor.props)
  })
}

我希望 MyWebSocketActor 在失败时停止(例如抛出异常)。这是默认的主管策略吗? 否则我如何定义这样的策略? (我不知道 MyWebSocketActor 是被创建为 top-level actor 还是被 Play 隐藏的某个 actor 的 children)

查看 WebSocketActorSupervisor 的代码,其中 Props 被转换为 actor,默认策略被覆盖为

 override def supervisorStrategy = OneForOneStrategy() {
  case _ => SupervisorStrategy.Stop
}

因此,Stop 是默认行为。

为了确保 Johny 的回答是正确的,请重写 MyWebSocketActor 的 postStop 方法。你会看到它在网络套接字丢失时被调用。

override def postStop() = {
    super.postStop()
    log.debug("connection lost")
  }

对于任何其他处理程序,这也是一个有用的挂钩,例如用户状态信息。