1

我有一个抽象类,它是一个演员,它有一个像这样的方法

def getNewConnection(id: String): ActorRef

A class that subclasses it defines the method.

  override def getNewConnection(id: String): ActorRef = {
    val actorRef = system.actorOf(Props(new RsvpClusterableClientConnection(service, id)))
    actorRef ! Subscribe(clientConnectionId)
    actorRef
  }

然后它存储那个actorRef。

问题是,当我去 context.children 时,它是空的。同样,如果子演员去 context.parent !“嘿!” 父母不会收到消息。如果我查看路径,context.partent 显示 /users/ 并且真正的父演员实际上类似于 /users/$2b

我找不到有类似问题的人。这是在一个类似这样的测试中:

class ZombieTest extends TestKit(ActorSystem("zombietest")) with HelperSpec with ShouldMatchers {

  import ExecutionContext.Implicits.global
[...]
val conActor = system.actorOf(Props(new ConnectionActor(testService1)))
}

编辑

AgileSteel 是正确的。从系统创建将创建一个顶级参与者。从上下文创建将创建一个孩子。

来自akka文档:

使用默认构造函数创建 Actor

object Main extends App {  
val system = ActorSystem("MySystem")   val myActor =
system.actorOf(Props[MyActor], name = "myactor") The call to actorOf

返回一个 ActorRef 的实例。这是 Actor 实例的句柄,您可以使用它与 Actor 进行交互。ActorRef 是不可变的,并且与它所代表的 Actor 具有一对一的关系。ActorRef 也是可序列化的和网络感知的。这意味着您可以对其进行序列化、通过线路发送并在远程主机上使用它,并且它仍将通过网络在原始节点上表示同一个 Actor。

在上面的示例中,actor 是从系统创建的。也可以使用演员上下文从其他演员创建演员。不同之处在于主管层次结构的排列方式。使用上下文时,当前演员将是创建的子演员的监督者。使用系统时,它将是一个顶级参与者,受系统监督(内部监护参与者)。

class FirstActor extends Actor {   val myActor =
context.actorOf(Props[MyActor], name = "myactor")
4

1 回答 1

7

您应该/必须调用actorOfcontext不是system在创建孩子时调用。

于 2013-04-09T18:50:44.013 回答