【问题标题】:Why does my actorFor fail when deployed to a Akka Microkernel JAR?为什么我的 actorFor 在部署到 Akka 微内核 JAR 时会失败?
【发布时间】:2013-05-25 09:30:06
【问题描述】:

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

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

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

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

编辑

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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

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

    上面提到的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")
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-10
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2013-07-01
      相关资源
      最近更新 更多