【发布时间】:2018-05-15 15:14:17
【问题描述】:
Akka 新手。创建一个扩展 SupervisorStrategy 的新 Scala 类为我提供了以下模板:
class MySupervisorStrategy extends SupervisorStrategy {
override def decider: Decider = ???
override def handleChildTerminated(context: ActorContext, child: ActorRef,
children: Iterable[ActorRef]): Unit = ???
override def processFailure(context: ActorContext, restart: Boolean,
child: ActorRef, cause: Throwable, stats: ChildRestartStats, children: Iterable[ChildRestartStats]): Unit = ???
}
我正在寻找一种访问方式:
-
Throwable/Exception是从儿童演员身上抛出的 - 引发异常的子actor
ActorRef - 传递给子actor的消息提示抛出异常
我认为只要孩子抛出异常,Decider(实际上是PartialFunction[Throwable,Directive])就会通过Throwable,但我没有看到我可以访问的地方我上面的列表中的#2 和#3。 有什么想法吗?
更新
从发布的小提琴看来,一个有效的Decider 是:
{
case ActorException(ref,t,"stop") =>
println(s"Received 'stop' from ${ref}")
Stop
case ActorException(ref,t,"restart") =>
println(s"Received 'restart' from ${ref}")
Restart
case ActorException(ref,t,"resume") =>
println(s"Received 'resume' from ${ref}")
Resume
}
以上,我看到了所有三个:
- 孩子抛出的异常
- 引发异常的孩子 (
ref) - 最初发送给孩子的消息(导致抛出异常)
看起来Decider 中没有需要在Supervisor 类中定义。我想将Decider 逻辑拉到MyDecider.scala 中,并找到一种方法来重构Supervisor,以便它的supervisorStrategy 使用MyDecider 的实例,所以可能类似于:
class Supervisor extends Actor {
import akka.actor.OneForOneStrategy
import akka.actor.SupervisorStrategy._
import scala.concurrent.duration._
var child: ActorRef = _
override val supervisorStrategy =
OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute, decider = myDecider)
...
}
【问题讨论】:
标签: akka akka-supervision