Scala 阿克卡模式监督

Scala 阿克卡模式监督,scala,akka,Scala,Akka,我在管理监督方面有问题 假设我有一个演员A,他创建了演员B并给他发送了一条消息 val B = context.actorOf(Props[B],"B") B ! RandomMessage(param1, param2) B进行计算或请求远程服务。基本上,它可以例外地失败 override val supervisorStrategy = OneForOneStrategy(loggingEnabled = false) { case exception:NetworkExceptio

我在管理监督方面有问题

假设我有一个演员A,他创建了演员B并给他发送了一条消息

 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
}
}


它工作正常,因为子参与者已重新启动,但如果我想重试此失败消息,该怎么办。如何执行此操作?

此消息可在
重新启动前查看

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 35; get
,而是使用
Option#getOrElse
,处理奇怪的情况

我可以使用preRestart,但我必须将message:Option[Any]强制转换为我的命令类型。目前我只有一个命令,但稍后我可能会添加更多命令,可能会出现问题我猜您已经在
receive
方法中使用模式匹配来处理消息。对于来自预重启的消息,同样的方法也足够了。只需确保使用
选项#get
,而不是发送选项本身。不要使用Option.get,它之所以是选项是有原因的,因为它并不总是可用的。