Стратегия супервайзера 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

    }
  }
}
Другие вопросы по тегам