播放:在失败的情况下停止 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")
}
对于任何其他处理程序,这也是一个有用的挂钩,例如用户状态信息。
我正在使用 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")
}
对于任何其他处理程序,这也是一个有用的挂钩,例如用户状态信息。