2017-09-12 4 views
0

J'essaye d'exécuter un pot runnable à partir d'une ligne de commande qui a intégré plusieurs processus akka. Bien que je ne sois pas l'auteur original de l'application, je sais que le code fonctionne assez bien dans une éclipse. Cependant, lorsque j'essaie d'exporter puis de l'exécuter en tant que Jar exécutable, il tombe après un certain temps et c'est quand il commence à initier les processus akka. Je cours à l'aide de Java 8Basé sur Akka Runnable Jar

java -jar something.jar {options} 

erreur:

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

mais comme je le dis semble fonctionner dans l'environnement Eclipse. qu'est-ce que je fais mal?

Merci d'avance.

Répondre

0

La réponse est au milieu du message d'erreur:

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

Une configuration simple regroupement ressemble à ceci, notez akka.actor.provider paramètre:

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

La config est un peu différente dans les nouvelles versions d'Akka, voir les détails dans http://doc.akka.io/docs/akka/current/scala/cluster-usage.html

actor { 
    provider = "cluster" 
    } 

Ainsi, votre application soit ne peut pas lire le application.conf des ressources pour une raison ou le fichier de configuration est pas correctement passé en paramètre à java jar

+0

En effet, la question est là 'akka.actor .provider' est défini lors de l'exécution d'eclipse, et pourquoi n'est-il pas répercuté correctement lors de l'exécution à partir d'un pot. Une autre chose que je peux imaginer est quand vous définissez cette valeur dans 'reference.conf' au lieu de' application.conf': parce que 'reference.conf' est lu dans le classpath, leur ordre peut ne pas être défini, donc vous ne devrait pas avoir de paramètres qui se chevauchent dans 'reference.conf' et placer plutôt la configuration de votre application principale dans' application.conf'. –