Выбор актера Akka Remote с конфигурацией

Есть ли способ настроить конфигурацию для выбора удаленного субъекта, аналогичного созданию удаленного субъекта, как указано в документы Akka:

akka {
  actor {
    deployment {
      /sampleActor {
        remote = "akka.tcp://[email protected]:2553"
      }
    }
  }
}

Я предпочитаю не определять для этого пользовательскую переменную.

system.actorSelection("sampleActor")

person Alex Stanovsky    schedule 13.11.2015    source источник


Ответы (1)


Из документации есть только две формы метода выбора актера:

Def ActorSelection (путь: ActorPath): АктерВыбор

Создайте akka.actor.ActorSelection из заданного пути, который анализируется на наличие подстановочных знаков (внутренне они заменяются регулярными выражениями). Не предпринимается никаких попыток проверить существование какой-либо части предоставленного пути, рекомендуется отправить сообщение и собрать ответы, чтобы разрешить совпадающий набор акторов.

def acterSelection (путь: строка): ActorSelection

Создайте akka.actor.ActorSelection из заданного пути, который анализируется на наличие подстановочных знаков (внутренне они заменяются регулярными выражениями). Не предпринимается никаких попыток проверить существование какой-либо части предоставленного пути, рекомендуется отправить сообщение и собрать ответы, чтобы разрешить совпадающий набор акторов.

И в любом случае ActorPath просто создается из строки:

def fromString(s: String): ActorPath

Разобрать строку как путь актера; бросает java.net.MalformedURLException, если не может этого сделать.

Таким образом, нет прямого способа выбрать актера, просто установив определенное значение в config. Однако довольно легко получить значение из конфигурации и использовать его для выбора актера. Учитывая конфиг:

akka {
  actor {
    selections: {
      sampleActor: {
        path: "akka.tcp://[email protected]:2553/user/sampleActor"
      }
    }
  }
}

Вы можете использовать:

val sampleActorSelection = 
  system.actorSelection(
    system.settings.config.getString("akka.actor.selections.sampleActor.path"))

Если бы вы часто использовали этот метод, вы могли бы использовать неявный класс, чтобы добавить в систему вспомогательный метод:

implicit class ActorSystemExtension(system: ActorSystem) {

  def actorSelectionFromConfig(actorName: String): ActorSelection {
    system.actorSelection(
        system.settings.config.getString(s"akka.actor.selections.${actorName}.path"))
  }
}
person mattinbits    schedule 15.11.2015
comment
Спасибо, но чем это отличается от использования пользовательской переменной? - person Alex Stanovsky; 15.11.2015
comment
Это не очень отличается. Краткий ответ на ваш вопрос будет таким: нет, нет, но я подумал, что более полный ответ будет полезнее. - person mattinbits; 15.11.2015