Scala 正在使用null actor创建Akka ActorRef

Scala 正在使用null actor创建Akka ActorRef,scala,null,akka,Scala,Null,Akka,我有一个Akka演员(在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, parm

我有一个Akka
演员(在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 _...]
  }
}
val myActorRef = MyActor (system, 3, 4, helperRef)
事实上,我有几个演员都遵循这个模式。但是这个,当我创建这样一个实例时:

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 _...]
  }
}
val myActorRef = MyActor (system, 3, 4, helperRef)
拒绝看到我发送的任何消息。
MyActor.receive()
中的断点永远不会被命中

我在调试器中搜索了一下,发现了一个名为
myActorRef.\u cellDoNotCallMeDirectly.\u actor
。对于所有其他参与者,此字段包含相关
Actor
子类的实例,这意味着在本例中,它应该包含
MyActor
的实例

但是,在本例中,该字段为
null

我怀疑这与
.receive()
没有看到任何消息有关。我很惊讶没有
NullPointerException
s四处飞舞,但是没有

此字段中的
null
值是否有特殊含义?我是不是搞砸了

谢谢, Dan Wiebe

尝试在其
preStart
方法中通知其他参与者您的参与者的存在,向他们发送消息,而不是依赖您创建参与者时创建的
ActorRef
。这应该能够解决可能会妨碍应用程序工作的任何并发错误

如果这不能解决问题,请启用完整日志记录,以便查看消息是否正确发送和接收。

尝试在其
启动前
方法中通知其他参与者您的参与者的存在,方法是向他们发送消息,而不是依赖创建参与者时创建的
ActorRef
。这应该能够解决可能会妨碍应用程序工作的任何并发错误


如果这无法解决问题,请启用完整日志记录,以便查看消息是否正确发送和接收。

您从何处调用
myActorRef!msg
。从某种意义上说,表达式是从一个Actor中的with调用的,还是从其他地方调用的?可能是由于某种原因,Actor未能初始化。构造函数中是否有任何代码,或
preStart
方法?您是否检查了日志中的初始化问题?你创造了这种类型的多个演员吗?因为名字总是相同的,这是不允许的。这可能是一个可能的重复:问题是无关紧要的,考虑一下答案。我看不出任何问题的答案。但是,我看到这里使用了一个反射来构造MyActor的实例。为什么不使用
道具(新的MyActor(parm1、parm2、parm3))
。它允许您在不进行反射的情况下进行操作。@Arseniyzhezelev该方法在2.2中被弃用,以防止关闭不可序列化的值。您从何处调用
myActorRef!msg
。从某种意义上说,表达式是从一个Actor中的with调用的,还是从其他地方调用的?可能是由于某种原因,Actor未能初始化。构造函数中是否有任何代码,或
preStart
方法?您是否检查了日志中的初始化问题?你创造了这种类型的多个演员吗?因为名字总是相同的,这是不允许的。这可能是一个可能的重复:问题是无关紧要的,考虑一下答案。我看不出任何问题的答案。但是,我看到这里使用了一个反射来构造MyActor的实例。为什么不使用
道具(新的MyActor(parm1、parm2、parm3))
。它允许您不进行反射。@ArseniyZhizhelev该方法在2.2中被弃用,以防止关闭不可序列化的值。