akka - делает одного актера дочерним для нескольких других акторов (в роутере)

Я не уверен, что это возможно - могу ли я сделать одного актера ребенком многих других актеров? Я, конечно, могу передать ссылку другим актерам, но мне нужен надзор, чтобы работать и в этом случае - это вообще возможно?

например, вот пример с типизированным субъектом, который является дочерним элементом системы - я хочу, чтобы он был дочерним элементом ConfigResponders в маршрутизаторе конфигурации

val zoolittle = Zoolittle(system, None, 
  Connect(LocalConfigService.zkAddress, LocalConfigService.zkSessionTimeout))
val configRouter = system.actorOf(Props(classOf[ConfigResponder], zoolittle).withRouter(
  RoundRobinRouter(nrOfInstances = 5)))

Я не хочу связку с БД в этом случае.

Заранее спасибо!

2 ответа

Решение

Каждый актер создается ровно одним другим актером, и этот актер является его родителем и его супервизором. Это имеет основополагающее значение для модели актера и того, что означает надзор.

Если вы хотите, чтобы актер был дочерним по отношению к вашим ConfigResponders, то каждый из ConfigResponders должен будет создать такого дочернего элемента. Если вы находитесь сразу после supervisorStrategy, пусть другой субъект контролирует это. Использование Router для установки supervisorStrategy возможно, но немного хакерски, поскольку обычно супервизору также приходится выполнять другие обязанности, такие как распределение работы или управление жизненным циклом ребенка.

Я понял это несколько. Проблема в том, что вы хотите иметь определенную стратегию контроля - вы можете использовать стратегию контроля из класса, например, создав маршрутизатор одного участника.

  val actor: ActorRef = system.actorOf(Props(classOf[ActorClass], system.deadLetters).withRouter(
    RoundRobinRouter(1, supervisorStrategy = zkSupervisor)))


  val zkSupervisor =
    AllForOneStrategy() {
      case _: WhateverException ⇒
       //do stuff
        Restart
    }
Другие вопросы по тегам