Dans Akka, je peux créer un acteur comme suit.
Akka.system(app).actorOf(Props(classOf[UnzipActor]), name="somename")
Ensuite, je suis dans une classe différente, comment puis-je obtenir cet acteur?
Je peux obtenir un ActorSelection
lazy val unzip: ActorSelection =
Akka.system.actorSelection("user/" + "somename")
Cependant, un ActorSelection
n'est pas ce que je veux; Je veux un ActorRef
. Comment obtenir un ActorRef
?
Je veux avoir un ActorRef
car je souhaite planifier un appel à un ActorRef
à l'aide du planificateur.
Akka.system(app).scheduler.schedule(
5 seconds, 60 seconds, mustBeActorRef, MessageCaseClass())
Vous pouvez utiliser la méthode resolveOne
sur un ActorSelection pour obtenir un ActorRef de manière asynchrone.
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")
}
réf: http://doc.akka.io/api/akka/2.3.6/index.html#akka.actor.ActorSelection
Recherche d'acteurs par chemin concret :
Pour acquérir un
ActorRef
lié au cycle de vie d'un acteur spécifique, vous devez envoyer un message, tel que le message intégréIdentify
, à l'acteur et utilisez la référencesender()
d'une réponse de l'acteur.
Mais pour le cas que vous décrivez, il pourrait être plus approprié d'utiliser le planificateur pour envoyer un message à un ActorRef
que vous avez déjà (comme self
ou un nouvel acteur temporaire), et réagir à ce message en envoyant un MessageCaseClass
à actorSelection("user/somename")
.