如何将参数传递给Scala对象

时间:2018-03-30 12:35:16

标签: scala akka akka-actor

我想只创建一次actor,并在应用中反复使用它的引用。为此,我创建了一个Scala对象,一切正常,但是当我尝试使用child actor时,我得到了NullPointerException。 这是代码:

object ActorManager {
  val getTestActorRef: ActorRef = system.actorOf(Props[TestActor], name = "testActor")
}

当我想要实例化一个子actor时会出现问题。这是代码:

object ActorManager {
  var context: ActorContext=_

  val getTestActorRef: ActorRef = system.actorOf(Props[TestActor], name = "testActor")

  val getTestChildActorRef: ActorRef = context.actorOf(Props[TestActor], name = "testActor")
}

class ParentTestActor extends Actor {

  ActorManager.context=context

  val childActor = ActorManager.getTestChildActorRef

  def receive ={
    //some code here
  }    
}

实例化ParentTestActor时会抛出

java.lang.ExceptionInInitializerError: null

请帮助我如何解决此问题。

1 个答案:

答案 0 :(得分:1)

你不应该在演员之外分享任何演员相关的状态。具体而言,您不应该共享像上下文,自我等特定于akka的变量。

应该从父母内部only创建儿童演员!从父preStart初始化它们是合理的(阅读有关演员生命周期的内容)

如果您需要在静态常量中使用这么多直接actor引用,请在对象中添加child: AtomicReference[ActorRef]并从父actor中设置它。