我对 Akka 在创建演员系统时承担的责任感到有点困惑。我想要一个父和两个子actor的简单应用程序,其中每个子actor驻留在不同的进程上(因此在不同的节点上)。现在我知道我可以使用带有远程配置的路由器或者只是启动一个远程参与者,但是(如果我错了,请纠正我)在创建这个远程参与者时,Akka 期望该进程已经存在并且节点已经在其上运行进程,然后它只将该子actor部署到该节点。没有任何方法可以让 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"
}
}
}
父级.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 上运行 main 之后立即在 Child.scala 中运行这个 main:
object Child extends App{
ActorSystem("mySys", ConfigFactory.load().getConfig("child"))
}
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
然后节点将连接。
如果没有任何方法可以做到这一点,那么当进程崩溃时,Akka 如何重新启动该进程/节点?