アクター システムを作成するときに Akka がどのような責任を負うのかについて、私はちょっと混乱しています。親アクターと 2 つの子アクターの単純なアプリケーションが必要で、各子は別のプロセス (したがって別のノード) に存在します。これで、リモート構成でルーターを使用したり、リモート アクターを起動したりできることがわかりましたが、(間違っていたら訂正してください) このリモート アクターを作成するとき、Akka はプロセスが既に存在し、ノードが既にその上で実行されていることを期待しています。プロセスを実行し、その子アクターをそのノードにデプロイするだけです。Akka にスポーンを行わせる方法はありませんか?
自分でプロセスを作成していないため、これは機能しないコードです。
アプリケーション.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 はそのプロセス/ノードをどのように再起動できますか?