阿卡新手。创建扩展的新 Scala 类SupervisorStrategy
为我提供了以下模板:
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
ActorRef
抛出异常的子actor- 传递给子actor的消息,提示抛出异常
我认为(Decider
实际上是 a 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)
...
}