基于this solution我实现了以下内容,但它抛出一个异常,说具有该名称的actor已经存在:
implicit val timeout = Timeout(5 seconds)
val pathToLookup: String = self.path.toString + "/" + actorName
context.actorSelection(pathToLookup).resolveOne().onComplete(useActor)
def useActor(possible: Try[ActorRef]) = {
val definite = possible match {
case Success(actor) =>
log.debug("Found an actor " + actorName)
actor
case Failure(_) =>
log.debug("Creating a new actor " + actorName)
context.actorOf(Props[MyActor], name = actorName)
}
// other code
}
我有一种感觉,我没有通过actorSelection
的正确路径,但我看不出如何修复它。
编辑:我纠正了儿童演员的路径,但仍然找不到演员。我也试过了toStringWithoutAddress
,但它也不起作用。
答案 0 :(得分:1)
ActorySystem.actorOf(props)
创建顶级演员,直接在/user/
下,而演员内部的context.actorOf(props)
创建演员作为该演员的子节点,因此他们将拥有路径{{1} }。
问题是你正在寻找/user/path/to/parent/child
下的演员,但是你正在创建他们作为当前演员的孩子,所以他们会像/user/[name]
那样。
另请注意,当您使用/user/myactor/[name]
和onComplete
时,您正在关闭actor状态并使用来自不同线程的内部actor事件。请参阅本节中有关该问题的警告:http://doc.akka.io/docs/akka/2.4.1/scala/actors.html#Ask__Send-And-Receive-Future