我想只创建一次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
请帮助我如何解决此问题。
答案 0 :(得分:1)
你不应该在演员之外分享任何演员相关的状态。具体而言,您不应该共享像上下文,自我等特定于akka的变量。
应该从父母内部only
创建儿童演员!从父preStart
初始化它们是合理的(阅读有关演员生命周期的内容)
如果您需要在静态常量中使用这么多直接actor引用,请在对象中添加child: AtomicReference[ActorRef]
并从父actor中设置它。