6

Akka アクター、より具体的にはを使用して作成されたクラスター シングルトンを監視しようとしてClusterSingletonManagerいます。例外、ログ、およびアクタのライフ サイクルをより細かく制御しようとしています。

残念ながら、ソリューションを実装した後、Singleton アクターが例外をスローするようにしましたが、ログには何も表示されず、アクターまたはクラスターもシャットダウンされませんでした。

私の実装は次のとおりです。

object SingletonSupervisor {
  case class CreateSingleton(p: Props, name: String)
}

class SingletonSupervisor extends Actor with ActorLogging {
  override val supervisorStrategy =
    OneForOneStrategy(maxNrOfRetries = 0, withinTimeRange = 1.minute) {
      case x: ActorInitializationException =>
        log.error(s"Actor=<${x.getActor}> trowed an exception=<${x.getCause}> with message=<${x.getMessage}>")
        Stop

      case x: ActorKilledException => Stop

      case x: DeathPactException => Stop

      case x: Exception =>
        log.error(s"Some actor threw an exception=<${x.getCause}> with message=<${x.getMessage}>, trace=<${x.getStackTrace}>")
        Escalate
    }

  def receive = {
    case CreateSingleton(p: Props, name: String) =>
      sender() ! context.actorOf(p)
      context.actorOf(ClusterSingletonManager.props(
        singletonProps = p,
        terminationMessage = PoisonPill,
        settings = ClusterSingletonManagerSettings(context.system)),
        name = name)
  }
}

では、Cluster Singlegon を監視することさえ可能ですか? 可能であれば、この問題にどのように対処すればよいですか?

4

1 に答える 1

6

supervisorStrategy考えられる解決策の 1 つは、指定された子を指定された状態でスポーンし、メッセージをその子に転送するスーパーバイザー アクターを作成することです。

スーパーバイザー アクターは次のとおりです。

class SupervisorActor(childProps: Props, override val supervisorStrategy) extends Actor {

  val child = context.actorOf(childProps, "supervised-child")

  def receive: Receive = {
    case msg => child forward msg
  }
}

監視対象のアクターをクラスター シングルトンとして作成する方法は次のとおりです。

context.actorOf(ClusterSingletonManager.props(
        singletonProps = Props(classOf[SupervisorActor], p, supervisorStrategy),
        terminationMessage = PoisonPill,
        settings = ClusterSingletonManagerSettings(context.system)),
        name = name)
于 2016-04-19T11:12:39.360 に答える