web-dev-qa-db-fra.com

Comment obtenir l'acteur d'Akka par son nom en tant qu'ActorRef?

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())
20
Phil

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

22
Arnaud Gourlay

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érence sender() 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").

5
Chris Martin