2017-09-12 4 views
0

Ich versuche ein lauffähiges Jar über eine Befehlszeile auszuführen, in die mehrere akka-Prozesse eingebettet sind. Obwohl ich nicht der ursprüngliche Autor der Anwendung bin, weiß ich, dass der Code in einer Sonnenfinsternis ziemlich glücklich läuft. Wenn ich jedoch versuche, zu exportieren und dann als runnable Jar laufen, dann fällt es nach einer gewissen Zeit und das ist, wenn es beginnt, die Akka-Prozesse zu initiieren. Ich betreibe es mit Java 8Akka basierte Runnable Jar

java -jar something.jar {options} 

Fehler:

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

aber wie ich sagen, es scheint in der Eclipse-Umgebung zu arbeiten. was mache ich falsch?

Vielen Dank im Voraus.

Antwort

0

Die Antwort ist in der Mitte der Fehlermeldung:

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

Eine einfache Clustering-Konfiguration wie folgt aussieht, beachten Sie akka.actor.provider Einstellung:

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 
    } 
} 

Die Konfiguration ist in den neueren Versionen von Akka etwas anders, siehe Details in http://doc.akka.io/docs/akka/current/scala/cluster-usage.html

actor { 
    provider = "cluster" 
    } 

So Ihre Anwendung entweder nicht die application.conf von Ressourcen aus irgendeinem Grund lesen oder die Konfigurationsdatei nicht korrekt als Parameter an Java übergeben wird -jar

+0

der Tat die Frage ist, wo 'akka.actor .provider' wird beim Ausführen von Eclipse festgelegt, und warum wird das nicht korrekt ausgeführt, wenn es aus einem Jar ausgeführt wird. Eine andere Sache, die ich mir vorstellen kann, ist, wenn Sie diesen Wert in 'reference.conf' anstelle von' application.conf' setzen: da 'reference.conf' aus dem Klassenpfad gelesen werden, ist ihre Reihenfolge möglicherweise nicht definiert, Sie also sollte keine überlappenden Einstellungen in 'reference.conf' enthalten und stattdessen Ihre Hauptanwendungskonfiguration in' application.conf' setzen. –

Verwandte Themen