如果在scala中不存在,则创建一个actor akka找不到actor

时间:2015-12-02 11:22:25

标签: scala akka actor

基于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,但它也不起作用。

1 个答案:

答案 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