2

私は Akka を初めて使用し、Scala にはまったく慣れていません。複数のマシンでプロジェクトを実行するために Akka+Java を使用しようとしています。Akka Java のサンプルをローカルで正常に実行できましたが、それらのいずれかを 2 台のマシンで実行しようとすると、コードが機能しなくなりました。Akka-Sample-Remote のソース コードも確認しました。単一のマシンでも動作しますが、複数のマシンで使用すると壊れます。構成の設定方法に問題があると思います。以下のように、問題を単純な HelloWorld 問題にまとめました。

コードは、Hello Actor プロジェクトと World Actor プロジェクトの 2 つの個別の構成ファイルを持つ 2 つのプロジェクトに分割されます。World Actor は、Hello アクターからの Hello メッセージの受信を待ってから、"Hello World" を出力します。以下に、これら 2 つのプロジェクトのコードと構成を示します。ご覧のとおり、World Actor はポート 1719 で開始され、Hello Actor はポート 1720 で開始され、 "akka.tcp://WorldApplication@192.27.336.187:1719/user/WorldActor" を使用して World Actor に接続しようとします。彼のコード/構成の何が問題なのかについて何か考えはありますか?

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

アプリケーション.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://WorldApplication@192.27.336.187: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);
        }
    }

}

アプリケーション.conf:

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

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

1 に答える 1

3

Patrcik が述べたように、Akka グループの Patrik が最終的に質問に答えました。問題は、両方の構成ファイルに Akka{} タグがないことでした。このタグを追加すると、問題が解決します。

于 2013-03-22T20:35:13.623 に答える