Scala 阿克卡模式监督
我在管理监督方面有问题 假设我有一个演员A,他创建了演员B并给他发送了一条消息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
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,它之所以是选项是有原因的,因为它并不总是可用的。