我在管理监督方面遇到了问题.
假设我有演员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,但是如果我想重试这个失败的消息怎么办呢.我怎样才能做到这一点 ?
该消息可用于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处理奇怪的情况.
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |