我试着选择一个已经创造出来的演员。这是一个代码:
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而不是正确的解决方案是不推荐的)
发布于 2014-10-24 05:27:14
请小心期货。在您的情况下,您正在接收可能在呼叫时刻未完成的未来--因此它的值可能为空:
scala> println("Selection from spec /user/myActorName/ " + system.actorSelection("/user/myActorName/").resolveOne().value)
Selection from spec /user/myActorName/ Nonevs
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 (它是阻塞的-所以,您应该在参与者的上下文/receive之外这样做)。
https://stackoverflow.com/questions/26541784
复制相似问题