Akka Удаленный выбор актера с настройкой

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

akka {
  actor {
    deployment {
      /sampleActor {
        remote = "akka.tcp://sampleActorSystem@127.0.0.1:2553"
      }
    }
  }
}

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

system.actorSelection("sampleActor")

1 ответ

Решение

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

def actorSelection (путь: ActorPath): ActorSelection

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

def actorSelection (path: String): ActorSelection

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

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

def fromString (s: String): ActorPath

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

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

akka {
  actor {
    selections: {
      sampleActor: {
        path: "akka.tcp://sampleActorSystem@127.0.0.1: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"))
  }
}
Другие вопросы по тегам