Стратегия супервайзера Akka для разных типов актеров
Я использую Akka и хочу определить свою собственную стратегию надзора для актера User Guardian. Я определил два типа актеров, называемых TaskActor и MessageActor. Они созданы как актеры высшего уровня. Я хочу, чтобы пользователь-хранитель применил следующую стратегию наблюдения: Остановите TaskActor и Resume MessageActor, когда они генерируют исключение (я не против того, какой конкретный тип исключения выдается). Как мне это сделать?
1 ответ
Я нашел следующее решение:
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
}
}
}