В Akka, как узнать, когда актер готов к использованию после регистрации в actorOf()?
Если я создаю актера с помощью context(). ActorOf() в Akka, я получаю верный ActorRef. Однако, если я делаю то же самое, но создаю ActorRef, используя actorFor и путь, по которому я знаю, что актер появится, я не получу надежный ответ ActorRef. Как я могу сказать, что актер был успешно зарегистрирован?
В приведенном выше описании я мог бы просто использовать ActorRef, возвращенный из actorOf(). Однако в моем реальном случае я создаю актера, который сам регистрирует дочернего актера, и мне нужно решить его, поэтому проблема в общем заключается в том, "как мне ждать / зарегистрироваться, чтобы получить информацию о том, что актер был зарегистрирован по известному пути?".
2 ответа
Прежде всего, нет гарантии, что ActorRef, который вы получите от actorOf, все еще жив, поскольку его конструктор мог потерпеть неудачу.
Во-вторых, actorFor может найти актера, но он умер сразу после того, как его нашли, и как раз перед тем, как вы начали с ним работать.
В-третьих, обычно хорошей практикой является структурирование вашего приложения таким образом, чтобы зависимости распространялись логическим образом, чтобы между вашими действующими лицами была естественная точка сближения.
Надеюсь, что-либо из перечисленного поможет,
счастливого пути!
√
Начиная с Akka 2.2.1 вы можете использовать ActorSelection.resolveOne, чтобы получить ActorRef из выбора актера:
implicit val timeout = Timeout(5, TimeUnit.SECONDS)
val selection = system.actorSelection("/user/myActor")
val actor = Await.result(selection.resolveOne(), timeout.duration)
Из документов http://doc.akka.io/api/akka/2.2.1/index.html
Разрешите ActorRef, соответствующий этому выбору. Результат возвращается как Future, который завершается с ActorRef, если такой актер существует. Он завершается с ошибкой ActorNotFound, если такого субъекта не существует или идентификация не завершена в течение предоставленного времени ожидания.
Под капотом он говорит с актером, чтобы проверить его существование и приобрести его ActorRef.