针对不同类型参与者的Akka主管策略
我正在使用Akka,我想为用户Guardian actor定义我自己的监督策略。我定义了两种类型的参与者,称为TaskActor和MessageActor。它们被实例化为顶级参与者。针对不同类型参与者的Akka主管策略,akka,actor,akka-supervision,error-kernel,Akka,Actor,Akka Supervision,Error Kernel,我正在使用Akka,我想为用户Guardian actor定义我自己的监督策略。我定义了两种类型的参与者,称为TaskActor和MessageActor。它们被实例化为顶级参与者。 我希望用户guardian应用以下监控策略:在抛出异常时停止TaskActor并恢复MessageActor(我不介意抛出什么类型的异常)。我该怎么做呢?我找到了以下解决方案: object ActorClassUtil { val ACTORS_PACKAGE = "utils.actors." val
我希望用户guardian应用以下监控策略:在抛出异常时停止TaskActor并恢复MessageActor(我不介意抛出什么类型的异常)。我该怎么做呢?我找到了以下解决方案:
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
}
}
}