2016-11-30 1 views
1

J'essaye de configurer le framework Akka dans Apache Felix. Je l'ai utilisé étapes ci-dessous:Impossible de configurer le framework Akka dans Apache Felix

  1. J'ai inclus ci-dessous les fichiers jar de paquet dans mon paquet de projets

    • -akka actor_2.11-2.4.11_1.0.0.jar
    • -akka cluster- tools_2.11-2.4.11_1.0.0.jar
    • -akka stream_2.11-2.4.11_1.0.0.jar
    • config-1.3.0.jar
    • scala-bibliothèque-2.11.8.jar
  2. est en dessous du code source, je me sers dans mon Activator pour créer le ActorSystem:

    public class Activator extends DependencyActivatorBase { 
        private static Logger logger = Logger.getLogger("COMMON"); 
        private static final String propertyPath = "config/"; 
        private ActorSystem actorSystem; 
    
        public synchronized void init(BundleContext context, 
         DependencyManager dependencyManager) throws Exception { 
         InputStream is = new FileInputStream(new File(propertyPath+"sourcemodel.log4j.properties")); 
         PropertyConfigurator.configure(is); 
         logger.info("Bundle Activator Start"); 
    
         actorSystem = ActorSystem.create("myname"); 
    
         Properties filterProps = new Properties(); 
         filterProps.put("pattern","/sourcemodel/.*"); 
    
         dependencyManager.add(createComponent() 
          .setInterface(Filter.class.getName(), filterProps) 
          .setImplementation(LoggingFilter.class)); 
         ... 
        } 
    } 
    
  3. à actorSystem = ActorSystem.create("myname"); Je reçois ci-dessous Exception:

    Caused by: java.lang.NoClassDefFoundError: scala/collection/Iterable

// Modifier

public class Activator extends DependencyActivatorBase { 
    private static Logger logger = Logger.getLogger("COMMON"); 
    private static final String propertyPath = "config/"; 
    private ActorSystem actorSystem; 
    @Override 
    public synchronized void init(BundleContext context, 
     DependencyManager dependencyManager) throws Exception { 
     InputStream is = new FileInputStream(new File(propertyPath+"sourcemodel.log4j.properties")); 
     PropertyConfigurator.configure(is); 
     logger.info("Bundle Activator Start"); 

     try { 
      Config myConfig = ConfigFactory.parseFile(new File(propertyPath + "reference.config")); 
      Config regularConfig = ConfigFactory.load(); 
      Config combined = myConfig.withFallback(regularConfig); 
      Config complete = ConfigFactory.load(combined); 
      actorSystem = ActorSystem.create("myname",complete); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 


     Properties filterProps = new Properties(); 
     filterProps.put("pattern","/sourcemodel/.*"); 

     dependencyManager.add(createComponent() 
       .setInterface(Filter.class.getName(), filterProps) 
       .setImplementation(LoggingFilter.class)); 

Après avoir modifié le code que je reçois ci-dessous exception:

java.lang.ClassNotFoundException: akka.event.DefaultLoggingFilter 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(ReflectiveDynamicAccess.scala:21) 
    at akka.actor.ReflectiveDynamicAccess$$anonfun$getClassFor$1.apply(ReflectiveDynamicAccess.scala:20) 
    at scala.util.Try$.apply(Try.scala:192) 
    at akka.actor.ReflectiveDynamicAccess.getClassFor(ReflectiveDynamicAccess.scala:20) 
    at akka.actor.ReflectiveDynamicAccess.createInstanceFor(ReflectiveDynamicAccess.scala:38) 
    at akka.actor.ActorSystemImpl.<init>(ActorSystem.scala:605) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:142) 
    at akka.actor.ActorSystem$.apply(ActorSystem.scala:119) 
    at akka.actor.ActorSystem$.create(ActorSystem.scala:67) 
    at akka.actor.ActorSystem.create(ActorSystem.scala) 
    at com.bitwise.tdm.sourcemodel.internal.Activator.init(Activator.java:79) 
    at org.apache.felix.dm.DependencyActivatorBase.start(DependencyActivatorBase.java:75) 
    at org.apache.felix.framework.util.SecureAction.startActivator(SecureAction.java:697) 
    at org.apache.felix.framework.Felix.activateBundle(Felix.java:2220) 
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2138) 
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:977) 
    at aQute.launcher.Launcher.update(Launcher.java:457) 
    at aQute.launcher.Launcher.activate(Launcher.java:354) 
    at aQute.launcher.Launcher.run(Launcher.java:238) 
    at aQute.launcher.Launcher.main(Launcher.java:87) 
+1

Pouvez-vous essayer d'installer les paquets dont vous dépendez en faisceaux au lieu de les intégrer? –

+0

Oui, j'ai utilisé les jarres bundles du framework Akka dont je dépends. Après l'exécution de l'application, je suis également en mesure de voir les paquets sont en état actif sur gogo shell. 62 | Actif | 1 | akka-actor_2.11-2.4.11_1.0.0 (1.0.0) 63 | Actif | 1 | akka-cluster-tools_2.11-2.4.11 (1.0.0) 64 | Actif | 1 | akka-stream_2.11-2.4.11 (1.0.0) 65 | Active | 1 | com.typesafe.config (1.3.0) 66 | Actif | 1 | org.scala-lang.scala-library –

+0

afaik Akka utilise beaucoup Reflection et Classloader Magic, donc je crains que certaines de ses parties ne fonctionnent pas bien avec un environnement OSGi et ses isolations de classloader. –

Répondre

0

Akka peut être utilisé dans un environnement OSGi. La limitation est a bundle must form one actor-system (vous ne pouvez pas avoir un acteur dans le groupe A et envoyer un message à un acteur dans le groupe B)

Comme Achim mentionné dans le commentaire, Akka fait beaucoup de réflexion (tout ce que vous fournissez dans le fichier application.conf fichier). Vous devez donc vous assurer que toutes les classes spécifiées dans la configuration sont importées par votre bundle.

L'équipe Akka fournit une documentation sur l'exécution d'Akka dans OSGi (voir le lien ci-dessus).

L'autre question concerne l'outil de construction que vous utilisez. Si vous utilisez BndTools, vous devez intégrer Scala dans Eclipse AND Gradle.

EDIT: jetez un oeil à cet exemple de travail https://github.com/lostiniceland/playground/tree/master/akka-osgi. Pour l'instant, il n'y a pas de support Scala 2.12 dans Scala IDE donc l'exemple doit être compilé et exécuté depuis Gradle