Scala 正在使用null actor创建Akka ActorRef
我有一个AkkaScala 正在使用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
演员(在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中被弃用,以防止关闭不可序列化的值。