首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择带有actorSelection的akka演员?

如何选择带有actorSelection的akka演员?
EN

Stack Overflow用户
提问于 2014-10-24 05:03:59
回答 1查看 13.2K关注 0票数 12

我试着选择一个已经创造出来的演员。这是一个代码:

代码语言:javascript
复制
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)

结果是:

代码语言:javascript
复制
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而不是正确的解决方案是不推荐的)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-24 05:27:14

请小心期货。在您的情况下,您正在接收可能在呼叫时刻未完成的未来--因此它的值可能为空:

代码语言:javascript
复制
scala> println("Selection from spec /user/myActorName/ " +   system.actorSelection("/user/myActorName/").resolveOne().value)
Selection from spec /user/myActorName/ None

vs

代码语言:javascript
复制
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

代码语言:javascript
复制
import scala.concurrent.ExecutionContext.Implicits.global

for (res <- system.actorSelection("/user/myActorName").resolveOne()) {
   println(res)
}

请记住onComplete/for是作为侦听器实现的,因此它们可能在不同的线程中执行。如果您需要当前线程中的结果--使用经典的Await.result (它是阻塞的-所以,您应该在参与者的上下文/receive之外这样做)。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26541784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档