リモートアクターを使用して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
}
}
}
俳優#15はポート50015に存在していますか? – Josef
俳優や俳優システムの作り方を間違っていない限り、はい、私は確信しています。 – PablodeAcero