1

アクター システムを作成するときに 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 はそのプロセス/ノードをどのように再起動できますか?

4

2 に答える 2

1

アクター システムの作成、監視、および再起動を担当します。Akka は、これらのアクター システム内のアクターのみを担当します。

于 2017-01-12T16:20:06.687 に答える