Как получить аккера Акка по имени как ActorRef?
В Акке я могу создать актера следующим образом.
Akka.system(app).actorOf(Props(classOf[UnzipActor]), name="somename")
Тогда я в другом классе, как я могу получить этого актера?
Я могу получить ActorSelection
lazy val unzip: ActorSelection =
Akka.system.actorSelection("user/" + "somename")
Однако не то, что я хочу; Я хочу ActorRef
. Как я могу получить ActorRef
?
Я хочу иметь ActorRef
, так как хочу запланировать вызов ActorRef
с помощью планировщика.
Akka.system(app).scheduler.schedule(
5 seconds, 60 seconds, mustBeActorRef, MessageCaseClass())
Ответы
Ответ 1
Вы можете использовать метод resolveOne
на ActorSelection, чтобы асинхронно получить ActorRef.
implicit val timeout = Timeout(FiniteDuration(1, TimeUnit.SECONDS))
Akka.system.actorSelection("user/" + "somename").resolveOne().onComplete {
case Success(actorRef) => // logic with the actorRef
case Failure(ex) => Logger.warn("user/" + "somename" + " does not exist")
}
ref: http://doc.akka.io/api/akka/2.3.6/index.html#akka.actor.ActorSelection
Ответ 2
Поиск участников по бетонному пути:
Чтобы получить ActorRef
, привязанный к жизненному циклу конкретного актера, вам нужно отправить сообщение, например, встроенное Identify
, актеру и используйте ссылку sender()
ответа от актера.
Но для случая, который вы описываете, может быть более целесообразным использовать планировщик для отправки сообщения в ActorRef
, который у вас уже есть (например, self
или новый временный актер), и реагировать на это сообщение отправив MessageCaseClass
в actorSelection("user/somename")
.