gpt4 book ai didi

scala - 如何使用actorSelection选择akka Actor ?

转载 作者:行者123 更新时间:2023-12-04 00:54:20 25 4
gpt4 key购买 nike

我正在尝试选择一个已经创建的 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

我也可以将消息传递给 Actor 并且它完成得很好。
我在 Actor 选择期间错过了什么?如何正确选择 Actor ?

更新

很奇怪,但是当我替换 system.actorSelection("/user/myActorName/").resolveOne().value
使用 system.actorFor("/user/myActorName/") 一切正常。我的意思是 actorFor 返回一个 Actor 。 (由于 actorFor 已被弃用,这不是正确的解决方案)

最佳答案

请谨慎对待 future 。在您的情况下,您收到的 future 可能在调用时未完成 - 因此其值可能为空:

scala> println("Selection from spec /user/myActorName/ " +   system.actorSelection("/user/myActorName/").resolveOne().value)
Selection from spec /user/myActorName/ None

对比
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 之外执行它)。

关于scala - 如何使用actorSelection选择akka Actor ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26541784/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com