Java 基于Akka的可运行Jar
我试图从命令行运行一个可运行的jar,该命令行中嵌入了几个akka进程。 虽然我不是应用程序的原始作者,但我知道代码在eclipse中运行得非常愉快。 然而,当我尝试导出并作为一个可运行的Jar运行时,它会在一段时间后崩溃,这就是它开始启动akka进程的时候。 我正在使用Java8运行它Java 基于Akka的可运行Jar,java,eclipse,akka,Java,Eclipse,Akka,我试图从命令行运行一个可运行的jar,该命令行中嵌入了几个akka进程。 虽然我不是应用程序的原始作者,但我知道代码在eclipse中运行得非常愉快。 然而,当我尝试导出并作为一个可运行的Jar运行时,它会在一段时间后崩溃,这就是它开始启动akka进程的时候。 我正在使用Java8运行它 java -jar something.jar {options} 错误: at akka.actor.ActorInitializationException$.apply(Actor.scala:1
java -jar something.jar {options}
错误:
at akka.actor.ActorInitializationException$.apply(Actor.scala:174)
at akka.actor.ActorCell.create(ActorCell.scala:607)
at akka.actor.ActorCell.invokeAll$1(ActorCell.scala:461)
at akka.actor.ActorCell.systemInvoke(ActorCell.scala:483)
at akka.dispatch.Mailbox.processAllSystemMessages(Mailbox.scala:282)
at akka.dispatch.Mailbox.run(Mailbox.scala:223)
at akka.dispatch.Mailbox.exec(Mailbox.scala:234)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Caused by: akka.ConfigurationException: ActorSystem [akka://ClusterSystem] needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses [akka.actor.LocalActorRefProvider]
at akka.cluster.Cluster.<init>(Cluster.scala:71)
at akka.cluster.Cluster$.createExtension(Cluster.scala:34)
at akka.cluster.Cluster$.createExtension(Cluster.scala:29)
at akka.actor.ActorSystemImpl.registerExtension(ActorSystem.scala:737)
at akka.actor.ExtensionId$class.apply(Extension.scala:79)
at akka.cluster.Cluster$.apply(Cluster.scala:29)
at akka.actor.ExtensionId$class.get(Extension.scala:91)
at akka.cluster.Cluster$.get(Cluster.scala:30)
at akka.cluster.Cluster.get(Cluster.scala)
at com.dynniq.its.csm.core.akka.Actor.preStart(Actor.java:93)
at akka.actor.Actor$class.aroundPreStart(Actor.scala:489)
at akka.actor.UntypedActor.aroundPreStart(UntypedActor.scala:95)
at akka.actor.ActorCell.create(ActorCell.scala:590)
@Override
public void preStart() {
**cluster = Cluster.get(getContext().system());**
cluster.subscribe(getSelf(), MemberUp.class);
preStartExtra();
}
位于akka.actor.ActorInitializationException$.apply(actor.scala:174)
在akka.actor.ActorCell.create(ActorCell.scala:607)
在akka.actor.ActorCell.invokeAll$1(ActorCell.scala:461)
在akka.actor.ActorCell.systemInvoke(ActorCell.scala:483)
在akka.dispatch.Mailbox.processAllSystemMessages上(Mailbox.scala:282)
在akka.dispatch.Mailbox.run(Mailbox.scala:223)
在akka.dispatch.Mailbox.exec(Mailbox.scala:234)
位于scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
位于scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
位于scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
在scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)中
原因:akka.ConfigurationException:ActorSystem[akka://ClusterSystem]需要在配置中启用“ClusterActorRefProvider”,当前使用[akka.actor.LocalActorRefProvider]
在akka.cluster.cluster.(cluster.scala:71)
位于akka.cluster.cluster$.createExtension(cluster.scala:34)
位于akka.cluster.cluster$.createExtension(cluster.scala:29)
在akka.actor.ActorSystemImpl.registerExtension(ActorSystem.scala:737)
位于akka.actor.ExtensionId$class.apply(Extension.scala:79)
在akka.cluster.cluster$.apply(cluster.scala:29)
位于akka.actor.ExtensionId$class.get(Extension.scala:91)
在akka.cluster.cluster$.get(cluster.scala:30)
在akka.cluster.cluster.get(cluster.scala)上
位于com.dynniq.its.csm.core.akka.Actor.preStart(Actor.java:93)
在akka.actor.actor$class.aroundPreStart(actor.scala:489)
在akka.actor.UntypedActor.aroundPreStart(UntypedActor.scala:95)
在akka.actor.ActorCell.create(ActorCell.scala:590)
@凌驾
公共无效预启动(){
**cluster=cluster.get(getContext().system())**
subscribe(getSelf(),MemberUp.class);
动脉前壁();
}
但正如我所说,它似乎在eclipse环境中工作。
我做错了什么
提前感谢。
< P>答案是在错误信息的中间:Caused by: akka.ConfigurationException: ActorSystem [akka://ClusterSystem] needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses [akka.actor.LocalActorRefProvider]
一个简单的集群配置如下所示,请注意akka.actor.provider设置:
较新版本的Akka的配置稍有不同,请参阅中的详细信息
因此,您的应用程序可能由于某种原因无法从资源中读取application.conf,或者配置文件没有作为参数正确地传递给java-jar事实上,问题是从eclipse运行时,
akka.actor.provider
设置在哪里,为什么从jar运行时没有正确地进行设置。我可以想象的另一件事是,当您在reference.conf
而不是application.conf
中设置此值时:因为reference.conf
是从类路径读取的,它们的顺序可能没有定义,因此,您不应该在reference.conf
中有重叠的设置,而应该将主应用程序配置放在application.conf
中。
akka {
actor {
provider = "akka.cluster.ClusterActorRefProvider"
}
remote {
transport = "akka.remote.netty.NettyRemoteTransport"
log-remote-lifecycle-events = off
netty {
hostname = "127.0.0.1"
port = 0
}
}
cluster {
seed-nodes = [
"akka://ClusterSystem@127.0.0.1:2551",
"akka://ClusterSystem@127.0.0.1:2552"]
auto-down = on
}
}
actor {
provider = "cluster"
}