作为监督的典范
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
并处理奇怪的情况。
我在管理监督方面遇到问题。
假设我有创建演员 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
并处理奇怪的情况。