为什么我的actorFor在部署到Akka Microkernel JAR时失败了?

时间:2013-05-25 00:54:15

标签: scala akka

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

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

然而,当我通过actorForsbt run本地引用演员时,它发现没问题。在生产中,我使用相同的.actorFor("akka://service-kernel/user/Tracker")并抛出NullPointerException。我可以通过日志确认生产中Tracker已发出确认信息已启动。

使用部署到JAR的Microkernel进行actor引用时是否存在任何问题?

修改

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

1 个答案:

答案 0 :(得分:0)

确认它与处理Microkernel的启动类有关。

上面提到的ServiceKernel在启动脚本中用于启动Microkernel JAR:./start com.package.ServiceKernel。在sbt shell中,这不是必需的,因此我提供的替代类适用于引用Actor系统。

然而,在微内核中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")
  }
}