我正在尝试选择一个已创建的actor。这是一个代码:
val myActor = system.actorOf(Props(classOf[MyActor]), "myActorName")
println("myActor path - " + akka.serialization.Serialization.serializedActorPath(myActor))
println("Selection from spec akka://unit-test/user/myActorName " + system.actorSelection("akka://unit-test/user/myActorName").resolveOne().value)
println("Selection from spec /user/myActorName/ " + system.actorSelection("/user/myActorName/").resolveOne().value)
结果是:
myActor path - akka.tcp://unit-test@127.0.0.1:46635/user/myActorName#1444872428
Selection from spec akka://unit-test/user/myActorName None
Selection from spec /user/myActorName/ None
此外,我可以向演员传递消息,并且完成得很好。 我在actorSelection期间错过了什么?如何正确选择演员?
已更新
这很奇怪,但当我替换system.actorSelection("/user/myActorName/").resolveOne().value
时
system.actorFor("/user/myActorName/")
一切正常。我的意思是actorFor
返回一个演员。 (由于actorFor
已弃用,这不是正确的解决方案)
答案 0 :(得分:15)
请小心期货。在您的情况下,您收到的未来可能未在呼叫时刻完成 - 因此其值可能为空:
scala> println("Selection from spec /user/myActorName/ " + system.actorSelection("/user/myActorName/").resolveOne().value)
Selection from spec /user/myActorName/ None
VS
scala> val fut = system.actorSelection("/user/myActorName/").resolveOne()
fut: scala.concurrent.Future[akka.actor.ActorRef] = scala.concurrent.impl.Promise$DefaultPromise@7eb8d7bd
<just wait some time here>
scala> fut.value
res21: Option[scala.util.Try[akka.actor.ActorRef]] = Some(Success(Actor[akka://default/user/myActorName#1625966960]))
要正确获取价值,请使用onComplete或for
- comprehesion / map
:
import scala.concurrent.ExecutionContext.Implicits.global
for (res <- system.actorSelection("/user/myActorName").resolveOne()) {
println(res)
}
请记住,onComplete / for是作为侦听器实现的,因此它们可能在不同的线程中执行。如果你需要当前线程中的结果 - 使用经典Await.result
(它是阻塞的 - 所以,你应该在actor的上下文/ receive
之外进行。)