作为监督的典范

Akka model supervision

我在管理监督方面遇到问题。

假设我有创建演员 B 并向他发送消息的演员 A。

 val B = context.actorOf(Props[B],"B")
 B ! RandomMessage(param1, param2)

B做计算或者请教远程服务。基本上它可能会因异常而失败。

 override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false) {
case exception:NetworkException => {
  Restart
  // here I don't have access to param1 and param2 to send message again
}

}

它工作正常,因为子 actor 已重新启动,但如果我想重试此失败消息怎么办。我该怎么做?

该消息在 preRestart 中可用。

override def preRestart(reason: Throwable, message: Option[Any]) = {
    self ! message.get
    //to continue default behavior. ie, to restart all child actors
    //you could even manage how you deal with your child actor here instead of calling super.preRestart
    super.preRestart(reason, message) 
}

确保您配置的监督策略不会陷入无限循环。

编辑

正如@Viktor Klang 提到的,不要使用 Option#get 而是使用 Option#getOrElse 并处理奇怪的情况。