我正在使用 Akka,我想为 User Guardian 演员定义我自己的监督策略。我定义了两种类型的actor,称为TaskActor 和MessageActor。它们被实例化为顶级演员。我希望用户监护人应用以下监督策略:当他们抛出异常时停止 TaskActor 并恢复 MessageActor(我不介意抛出什么特定类型的异常)。我该怎么做?
问问题
208 次
1 回答
0
我找到了以下解决方案:
object ActorClassUtil {
val ACTORS_PACKAGE = "utils.actors."
val TASK_ACTOR_CLASS_NAME = ACTORS_PACKAGE + "TaskActor"
val MSG_ACTOR_CLASS_NAME = ACTORS_PACKAGE + "MessageActor"
def getFailedActorClassFrom(e: Exception): String = {
val stackTrace = e.getStackTrace
// FQCN (Fully Qualified Class Name)
stackTrace(0) getClassName
}
}
class UserGuardianSupervisorStrategy extends SupervisorStrategyConfigurator {
import ActorClassUtil._
def create(): OneForOneStrategy = {
OneForOneStrategy(maxNrOfRetries = 20, withinTimeRange = 1 minute) {
case _: ActorInitializationException => Stop
case _: ActorKilledException => Stop
case _: DeathPactException => Stop
case exception: Exception =>
val actorClassName = getFailedActorClassFrom(exception)
if (actorClassName startsWith TASK_ACTOR_CLASS_NAME)
Stop
else
if (actorClassName startsWith MSG_ACTOR_CLASS_NAME)
Resume
else
Stop
}
}
}
于 2015-06-03T09:21:28.553 回答