1

我有一个Actor看起来像这样的 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 _...]
  }
}

实际上,我有几个Actor遵循这种模式的 s。但是这个,当我创建一个这样的实例时:

val myActorRef = MyActor (system, 3, 4, helperRef)

拒绝查看我发送的任何消息。中的断点MyActor.receive ()永远不会被击中。

我在调试器中摸索了一下,发现了一个名为myActorRef._cellDoNotCallMeDirectly._actor. 对于我的所有其他参与者,该字段包含相关Actor子类的实例,这意味着在这种情况下它应该包含MyActor.

但是,在这种情况下,该字段是null

我怀疑这与.receive ()没有看到任何消息的事实有关。我很惊讶没有NullPointerException飞来飞去,但没有。

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

谢谢,丹·维比

4

1 回答 1

1

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

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

于 2013-08-21T13:18:07.490 回答