2013-03-19 4 views
2

Je suis nouveau à Akka et je ne suis pas du tout familier avec Scala. J'essaie d'utiliser l'Akka + Java pour exécuter un projet sur plusieurs machines. J'ai réussi à exécuter des exemples Akka Java localement mais lorsque j'ai essayé d'exécuter l'un d'eux sur deux machines, le code cesse de fonctionner. J'ai aussi regardé le code source Akka-Sample-Remote. Il fonctionne également sur une seule machine mais se brise lorsqu'il est utilisé sur plusieurs machines. Je pense que le problème est avec la façon dont je définis les configurations. J'ai résumé le problème dans un problème simple HelloWorld comme ci-dessous.Akka Connexion à distance utilisant Java

Le code est divisé en deux projets avec deux fichiers de configuration distincts: un projet Hello Actor et un projet World Actor. World Actor attend de recevoir le message Hello de l'acteur Hello, puis imprime le "Hello World". Ci-dessous vous pouvez voir le code et la configuration de ces deux projets. Comme vous pouvez le voir, le World Actor est lancé sur le port 1719 et le Hello Actor démarre sur le port 1720 et tente de se connecter au World Acteur en utilisant "akka.tcp: //[email protected]: 1719/user/WorldActor". Une idée sur ce qui ne va pas avec le code/configuration?

JWorld.java:

public class JWorld { 

    public static void main(String[] args) { 
    JWorldApplication app = new JWorldApplication(); 
    System.out.println("Started World Application - waiting for Hello message"); 
    } 

} 

JWorldApplication.java:

import akka.actor.ActorRef; 

import akka.actor.ActorSystem; 
import akka.actor.Props; 
import com.typesafe.config.ConfigFactory; 

public class JWorldApplication { 
    private ActorSystem system; 

    public JWorldApplication() { 
    system = ActorSystem.create("WorldApplication", ConfigFactory.load() 
     .getConfig("WorldConfig")); 
    ActorRef actor = system.actorOf(new Props(JWorldActor.class), 
     "WorldActor"); 
    } 
} 

JWolrdActor.java:

import akka.actor.UntypedActor; 


public class JWorldActor extends UntypedActor { 
    @Override 
    public void onReceive(Object message) { 

     if (message instanceof HelloMessage) { 
      HelloMessage recMsg = (HelloMessage) message; 
      System.out.println("Received Message: " + recMsg.getText()); 
      System.out.println("***** Hello World! ******"); 
     } else { 
      System.out.println("UnHandled Message Received"); 
      unhandled(message); 
     } 
    } 

} 

HelloMessage.java:

import akka.actor.ActorRef; 

public class HelloMessage{ 
    private ActorRef receiver; 
    private String text; 
    HelloMessage() {} 
    HelloMessage(ActorRef receiver){ this.receiver = receiver;} 
    public ActorRef getReceiver(){ return receiver;} 
    public void setText(String text) { this.text = text;} 
    public String getText() {return text;} 
} 

application.conf:

WorldConfig { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 

    remote { 
    netty.tcp { 
     hostname="192.27.336.187" 
     port=1719 
    } 
    } 
} 

JHello.java:

public class JHello { 

public static void main(String[] args) { 
    JHelloApplication testApp = new JHelloApplication(); 
    System.out.println("Started Hello Application - Sending Hello Message"); 
    testApp.sayHello(); 


} 
} 

JHelloApplication.java:

import akka.actor.ActorRef; 
import akka.actor.ActorSystem; 
import akka.actor.Props; 

import com.typesafe.config.ConfigFactory; 

public class JHelloApplication { 
    private ActorSystem system; 
    private ActorRef remoteActor, myActor; 

    public JHelloApplication() { 
     system = ActorSystem.create("HelloApplication", ConfigFactory.load() 
       .getConfig("HelloConfig")); 
     myActor = system.actorOf(new Props(JHelloActor.class),"HelloActor"); 
     remoteActor = system 
       .actorFor("akka.tcp://[email protected]:1719/user/WorldActor"); 
    } 

    public void sayHello() { 
     myActor.tell(new HelloMessage(remoteActor)); 
    } 

} 

JHelloActor.java:

import akka.actor.ActorRef; 
import akka.actor.UntypedActor; 

public class JHelloActor extends UntypedActor { 

    @Override 
    public void onReceive(Object message) { 
     if (message instanceof HelloMessage) { 
      HelloMessage msg = (HelloMessage) message; 
      if (msg.getReceiver() !=null){ 
       msg.setText("Hello"); 
       msg.getReceiver().tell(msg, getSelf()); 
      } 
     } else { 
      System.out.println("UnHandled Message Received"); 
      unhandled(message); 
     } 
    } 

} 

appli cation.conf:

HelloConfig { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 

    remote { 
    netty.tcp { 
     hostname="192.27.336.187" 
     port=1720 
    } 
    } 
} 
+1

a été répondu dans la liste de diffusion akka: https://groups.google.com/d/msg/akka-user/1tLBTZdo8tA/bhCqkilFlxcJ –

Répondre

2

Comme mentionné par Patrcik la question est finalement répondu par Patrik sur les groupes Akka. Le problème était que la balise Akka {} manquait dans les deux fichiers de configuration. L'ajout de cette balise résout le problème.

Questions connexes