2017-09-12 51 views
0

我試圖從嵌入了幾個akka進程的命令行運行一個可運行jar。 雖然我不是應用程序的原始作者,但我知道代碼在日食中運行得非常愉快。 但是,當我嘗試導出然後作爲可運行Jar運行時,它會在一段時間後崩潰,並且這會在啓動akka進程時啓動。 我使用Java 8基於Akka的Runnable Jar

運行它
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(); 
    } 

,但就像我說的,似乎在Eclipse環境中工作。 我做錯了什麼?

在此先感謝。

回答

0

答案是錯誤消息的中間:

Caused by: akka.ConfigurationException: ActorSystem [akka://ClusterSystem] needs to have a 'ClusterActorRefProvider' enabled in the configuration, currently uses [akka.actor.LocalActorRefProvider] 

一個簡單的集羣配置看起來像這樣,注意akka.actor.provider設置:

http://doc.akka.io/docs/akka/2.1.2/cluster/cluster-usage-scala.html

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://[email protected]:2551", 
     "akka://[email protected]:2552"] 

    auto-down = on 
    } 
} 

在較新版本的Akka中,配置有點不同,詳見http://doc.akka.io/docs/akka/current/scala/cluster-usage.html

actor { 
    provider = "cluster" 
    } 

所以您的應用程序或者不能讀取資源application.conf出於某種原因或配置文件不作爲參數傳遞給Java的罐子

+0

事實上,問題是在哪裏'akka.actor正確地傳遞.provider'在eclipse中運行時設置,爲什麼從jar中運行時不能正確執行。我可以想象的另一件事是,當你在'reference.conf'而不是'application.conf'中設置這個值時:因爲'reference.conf'是從classpath中讀取的,所以它們的順序可能沒有定義,所以你不應在'reference.conf'中有重疊設置,而應將主應用程序配置放在'application.conf'中。 –