Je suis un peu confus quant à la responsabilité qu'Akka prend lors de la création d'un système d'acteur. Je veux avoir une application simple d'un parent et de deux acteurs enfants où chaque enfant réside sur un processus différent (et donc sur un nœud différent). Maintenant je sais que je peux utiliser un routeur avec une configuration distante ou simplement démarrer un acteur distant, mais (et corrigez-moi si je me trompe), Akka s'attend à ce que le processus existe déjà et que le nœud fonctionne déjà ce processus, puis son seul déploiement de cet acteur enfant à ce nœud. N'y a-t-il aucun moyen de faire Akka faire le frai pour nous?Faire Akka spawn un processus pour le noeud distant
C'est le code qui ne fonctionne pas parce que je ne l'ai pas créé moi-même le processus:
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")
}
}
et Child.scala:
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
Mais si je lance ce principal à l'intérieur Child.scala droit après l'exécution de la principale Parent.scala:
object Child extends App{
ActorSystem("mySys", ConfigFactory.load().getConfig("child"))
}
class Child extends Actor with ActorLogging{
override def receive: Receive = {
case x=> //Ignore
}
}
Ensuite, le nœud se connecter.
S'il n'y a aucun moyen de le faire, comment Akka peut-il redémarrer ce processus/noeud lorsque le processus est écrasé?
Avez-vous une référence dans la documentation? Je ne l'ai pas vu mentionné nulle part –
C'est implicite dans les docs. Akka ne gère pas le lancement ou le redémarrage de JVM. C'est hors de portée. – Ryan
Alors disons que je veux créer des acteurs enfants sur différents jvms, alors si je dois générer le processus moi-même (et ce processus lancera 'ActorSystem (" mySys ")' avec 'akka.remote.netty.tcp. port = 0') alors comment le parent saura-t-il sur quel port ce processus s'exécute afin qu'il puisse y déployer l'acteur enfant? il semble étrange qu'Akka qui a un modèle de base de gestionnaire-travailleurs ne gère pas le cas d'avoir des travailleurs à distance (où le nombre de travailleurs est dynamique afin que les processus ne peuvent pas être initiés à l'avance) –