web-dev-qa-db-ja.com

ActorRefとして名前でAkkaアクターを取得する方法?

Akkaでは、次のようにアクターを作成できます。

Akka.system(app).actorOf(Props(classOf[UnzipActor]), name="somename")

それから私は別のクラスにいます、どうやってこの俳優を手に入れることができますか?

ActorSelectionを手に入れられます

lazy val unzip: ActorSelection =
  Akka.system.actorSelection("user/" + "somename")

ただし、ActorSelectionは私が望んでいるものではありません。 ActorRefが欲しい。 ActorRefを入手するにはどうすればよいですか?

スケジューラを使用してActorRefへの呼び出しをスケジュールしたいので、ActorRefが必要です。

Akka.system(app).scheduler.schedule(
  5 seconds, 60 seconds, mustBeActorRef, MessageCaseClass())
20
Phil

ActorSelectionでメソッドresolveOneを使用して、非同期に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

22
Arnaud Gourlay

具体的なパスでアクターを検索

特定のアクターのライフサイクルにバインドされているActorRefを取得するには、組み込みの Identify メッセージなどのメッセージを送信する必要があります。アクターと、アクターからの応答のsender()参照を使用します。

しかし、あなたが説明しているケースでは、スケジューラを使用して、既に持っているActorRefselfまたは新しい一時的なアクタなど)にメッセージを送信し、反応する方が適切な場合がありますMessageCaseClassactorSelection("user/somename")に送信して、そのメッセージに送信します。

5
Chris Martin