0

将一个稍微简单的项目部署到 JAR 中。我正在启动一个主管actor,它通过发送以下日志消息来确认它正在启动:

[akka://service-kernel/user/Tracker] Starting new Tracker

但是,当我通过actorFor本地使用 an来引用演员时sbt run,它发现没有问题。在生产中,我使用相同的.actorFor("akka://service-kernel/user/Tracker"),它会抛出一个NullPointerException. 我可以通过日志确认,在生产中,它Tracker已经发出了它启动的确认信息。

使用部署到 JAR 的微内核进行参与者引用时是否有任何问题?

编辑

我怀疑我引用系统的方式和 Akka 处理启动类的方式都与这个问题有关。由于我指定了一个名为 的启动类ServiceKernel,因此我正在执行引用:ServiceKernel.system.actorFor. 如果确认将提供答案。

4

1 回答 1

0

确认它与处理微内核的启动类有关。

上面提到的ServiceKernel用于启动微内核 JAR 的启动脚本:./start com.package.ServiceKernel. 在 sbt shell 中,这不是必需的,因此我提供的替代类可以很好地引用 Actor System。

但是,在微内核中,ServiceKernel似乎完全使用了不同的 Actor 系统,因此如果您引用该系统(就像我所做的那样),那么actorFor查找将始终失败。我通过将系统向下传递到引导类到我进行actorFor引用的特定类中解决了这个问题,并且它起作用了。是这样的吗(伪代码):

class ServiceKernel extends Bootable {

  val system = ActorSystem("service-kernel")

  def startup = {
    system.actorOf(Props(new Boot(isDev, system))) ! Start
  }

}

然后将其传递给一个HttpApi类:

class Boot(val isDev: Boolean, system: ActorSystem) extends Actor with SprayCanHttpServerApp {

  def receive = {
    case Start =>
          // setup HTTP server
          val service = system.actorOf(Props(new HttpApi(system)), "tracker-http-api")
  }
}
于 2013-05-25T01:30:06.383 回答