2017-05-04 6 views
1

リモートアクターを使用してAkkaアプリケーションのサンプルを作成しようとしています。目標は、例えば、俳優16が俳優15,15〜14などと交渉し、俳優16と1つの会話を交互に行うメッセージを連続的に交換する16人の俳優を作成することである。しかし、私は連続してこのエラーがあるので、私はコミュニケーションに問題があります。デッドレターAkkaを使用してメッセージリングを作成する

[INFO] [2017年5月4日15:45:58.248] [ActorFlasks-akka.actor.default-ディスパッチャ-4] [アッカ:// ActorFlasks/deadLetters]メッセージ[れるjava.lang .String] からアクタ[akka:// ActorFlasks/user/16#-2022012132]から にアクタ[akka:// ActorFlasks/deadLetters]は配信されませんでした。 [1]死んだ 文字が見つかりました。

これを行うには、アプリケーションの16のターミナルインスタンスを実行します。常に異なる構成ファイルを使用します。設定ファイルの例がこれです

object Main extends App { 

    val localId = args(0) 

    val configFile = getClass.getClassLoader.getResource(s"application$localId.conf").getFile 
    val config = ConfigFactory.parseFile(new File(configFile)) 
    val system = ActorSystem("ActorFlasks" , config) 
    val remote = system.actorOf(Props[CyclonManager], name=localId) 

    remote ! "START" 
} 

:私はそうのような各インスタンスでactorsystemを作成

akka { 
    actor { 
    provider = remote 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     hostname = "localhost" 
     port = 50001 
    } 
} 
} 

と俳優が、このように定義されています

class CyclonManager extends Actor { 

    def propagateMessage(): Unit = { 
    val localId = self.path.name.toInt 
    val currentPort = 50000 + localId 
    val nextHopPort = if (currentPort == 50001) 50016 else currentPort - 1 
    val nextHopId = localId-1 

    val nextHopRef = context.actorSelection(s"akka.tcp://[email protected]:$nextHopPort/user/$nextHopId") 

    nextHopRef ! "NEXT" 
    } 

    override def receive: Receive = { 
    case "START" => 
     if (self.path.name == "16") { 
     propagateMessage() 
     } 
    case "NEXT" => 
     propagateMessage() 
    case _ => 
     println("Unrecognized message") 
    } 
} 

それはあります私を始めさせる簡単な例ですが、私が試しても何の問題もありません。誰かが私がどこで失敗しているか知っていますか?あなたの例を再構築し、実行した後、私はpropagateMessage機能で1つの間違いを見つけ

akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
    remote { 
    enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
     hostname = "localhost" 
     port = 50015 
    } 
} 
} 
+0

俳優#15はポート50015に存在していますか? – Josef

+0

俳優や俳優システムの作り方を間違っていない限り、はい、私は確信しています。 – PablodeAcero

答えて

1

は、事前に

EDITありがとうございました。それは、あなたの問題を解決し、私の迅速かつ汚いが、作業のコードを実行してみてください、それはあなたのものと異なっているかを確認していない場合

val nextHopId = localId-1 

val nextHopId = if (currentPort == 50001) 16 else localId-1 

であるべき:https://gist.github.com/grantzvolsky/4a53ce78610038a9d44788d7151dc416

私にはコード私は俳優14,15、および16のみを使用しました。それぞれsbt "run 16"などを使用して実行できます。

+0

はい、私はその質問を提出した後でしかそのミスを見ませんでしたが、それを修正することは助けになりませんでした。自分のコードを自分のものに変更しましたが、それでも問題は解決しません...ローカルホストの設定で問題が発生する可能性がありますか?または、私が使用しているakkaのバージョンで(2.5.0) – PablodeAcero

+0

私は 'akka-remote'依存関係を追加しました。これは私のbuild.sbtの最後の行です。理論的には、ファイアウォールが通信をブロックしている可能性がありますが、そうは思われません。あなたは3つのノードすべての完全な出力を提供しますか?ここに私のことです:(私は最初にノード14、次に15と16を開始することに注意してください):http://imgur.com/a/l53pV – Josef

+0

こんにちは!私はコードと設定を試しました。ノード14,15は正常出力を有する。しかし、ノード16は次のように私に教えてくれます:http://imgur.com/a/tZi6T – PablodeAcero

関連する問題