我有一个Akka Actor
(在Scala中),如下所示:
object MyActor {
def apply (system: ActorSystem, parm1: Int, parm2: Int, parm3: ActorRef): ActorRef = {
system.actorOf (Props (classOf[MyActor], parm1, parm2, parm3), "myactor")
}
}
class MyActor (parm1: Int, parm2: Int, parm3: ActorRef) extends Actor {
def receive = {
[...bunch of cases, ending with _...]
}
}
实际上,我有几个Actor
符合这种模式。但是这个,当我创建这样的实例时:
val myActorRef = MyActor (system, 3, 4, helperRef)
拒绝查看我发送的任何消息。 MyActor.receive ()
中的断点永远不会被击中。
我在调试器中稍微戳了一下,发现了一个名为myActorRef._cellDoNotCallMeDirectly._actor
的字段。对于我的所有其他actor,此字段包含相关Actor
子类的实例,这意味着在这种情况下它应包含MyActor
的实例。
但是,在这种情况下,该字段为null
。
我怀疑这与.receive ()
没有看到任何消息这一事实有关。我很惊讶没有NullPointerException
飞来飞去,但是没有。
此字段中的null
值是否意味着什么?我以某种方式搞砸了吗?
谢谢, Dan Wiebe
答案 0 :(得分:1)
尝试通过向其发送消息,通过其preStart
方法通知其演员存在的其他演员,而不是依赖于创建演员时创建的ActorRef
。这应该排除可能阻止您的应用程序工作的任何并发错误。
如果不能解决问题,请启用完整日志记录,以便查看是否正确发送和接收邮件。