将一个简单的项目部署到JAR。我正在启动一个主管演员,通过发送以下日志消息确认它正在启动:
[akka://service-kernel/user/Tracker] Starting new Tracker
然而,当我通过actorFor
在sbt run
本地引用演员时,它发现没问题。在生产中,我使用相同的.actorFor("akka://service-kernel/user/Tracker")
并抛出NullPointerException
。我可以通过日志确认生产中Tracker
已发出确认信息已启动。
使用部署到JAR的Microkernel进行actor引用时是否存在任何问题?
我怀疑我引用系统的方式和Akka处理启动类的方式都与问题有关。由于我已经指定了一个名为ServiceKernel
的启动类,因此我执行了这样的引用:ServiceKernel.system.actorFor
。如果得到确认,将提供答案。
答案 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")
}
}