アクターシステムの作成時にAkkaがどのような責任を負うのか混乱します。 私は、各子が異なるプロセス(したがって異なるノード)に存在する親と2人の子アクターの単純なアプリケーションを作成したいと考えています。 リモートの設定でルータを使用することも、リモートアクタを起動することもできますが、このリモートアクタを作成する際に私が間違っていると私を修正することができます。Akkaは、プロセスが既に存在し、そのプロセスを実行し、その子アクターをそのノードにのみデプロイします。 Akkaを私たちのために産卵させる方法はありませんか?Akkaにリモートノード用のプロセスを作成させる
私は自分自身をプロセスを作成していないので、これが動作しないコードです:
application.conf:
akka {
remote.netty.tcp.port = 2552
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
child {
akka {
remote.netty.tcp.port = 2550
actor {
provider = "akka.remote.RemoteActorRefProvider"
}
}
}
Parent.scala:
object Parent extends App{
val system = ActorSystem("mySys")
system.actorOf(Props[Parent],"parent")
}
class Parent extends Actor with ActorLogging{
override def preStart(): Unit = {
super.preStart()
val address = Address("akka.tcp", "mySys", "127.0.0.1", 2550)
context.actorOf(Props[Child].withDeploy(Deploy(scope = RemoteScope(address))), "child")
}
override def receive: Receive = {
case x => log.info(s"Got msg $x")
}
}
とChild.scala:
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
しかし、私は右Parent.scala上のメインを実行した後Child.scala内の主にこれを実行する場合:
object Child extends App{
ActorSystem("mySys", ConfigFactory.load().getConfig("child"))
}
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
その後ノードが接続されます。
これを実行する方法がない場合、プロセスがクラッシュしたときにAkkaがそのプロセス/ノードを再起動する方法はありますか?
ドキュメントにはリファレンスがありますか?私はそれがどこでも言及されて見たことがない –
それは暗黙の文書です。 Akkaは、JVMの起動または再起動を処理しません。それは範囲外です。 – Ryan
それゆえ、別のjvmsで子アクターを作成したいとしたら、自分自身でプロセスを生成しなければならないとします(そのプロセスは 'akka.remote.netty.tcpでActorSystem(" mySys ")を実行します)。ポート= 0')、親プロセスはそのプロセスが実行するポートをどのように知っているので、その上に子アクターを配置できますか?そのマネージャーワーカーの基本パターンを持つAkkaはリモートワーカーを抱えるケースを扱えません(従業員の数が動的なので、プロセスを先進的に開始することはできません) –