0

私は Akka を使用しており、ユーザー ガーディアン アクターの独自の監督戦略を定義したいと考えています。TaskActor と MessageActor という 2 種類のアクターを定義しました。それらはトップレベルのアクターとしてインスタンス化されます。ユーザー ガーディアンに次の監視戦略を適用してほしいと思います: TaskActor を停止し、MessageActor が例外をスローしたときに再開します (スローされる例外の特定のタイプは気にしません)。どうすればいいですか?

4

1 に答える 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 に答える