阿卡模型监督

Axp*_*pom 3 scala akka

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

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

 val B = context.actorOf(Props[B],"B")
 B ! RandomMessage(param1, param2)
Run Code Online (Sandbox Code Playgroud)

B这样做计算或询问远程服务.基本上它可能会因Exception而失败.

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

}

它运行正常,因为重启了子actor,但是如果我想重试这个失败的消息怎么办呢.我怎样才能做到这一点 ?

Joh*_*shy 6

该消息可用于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) 
}
Run Code Online (Sandbox Code Playgroud)

确保将监督策略配置为不会陷入无限循环的方式.

编辑

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