Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
针对不同类型参与者的Akka主管策略_Akka_Actor_Akka Supervision_Error Kernel - Fatal编程技术网

针对不同类型参与者的Akka主管策略

针对不同类型参与者的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

我正在使用Akka,我想为用户Guardian actor定义我自己的监督策略。我定义了两种类型的参与者,称为TaskActor和MessageActor。它们被实例化为顶级参与者。
我希望用户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

    }
  }
}