J'ai un problème, où la deuxième invocation de mon programme donne un comportement imprévisible. J'essaye d'assurer une fermeture gracieuse d'une application akka-remoting.Terminaison du système Akka Acteur distant
J'ai deux systèmes d'acteur, un système d'acteur local et un système d'acteur à distance.
Le système d'acteur local
- crée deux acteurs, l'un sur le système local et un sur le
- s'arrête
I première télécommande démarrer le système d'acteur à distance, puis exécutez le système d'acteur local.
Lorsque je lance la première fois, tout va bien et le système d'acteur local s'arrête (la télécommande est toujours allumée). Mais si je l'exécute une seconde fois (sans redémarrer le système à distance), le comportement est différent et les deux systèmes d'acteur commencent à battre le cœur. Le local ne s'arrête pas.
Le code minimal pour reproduire le comportement est inférieur à
Système Acteur local
object ActorAsSink_7 extends App {
val system = ActorSystem("system")
val localActor = system.actorOf(MyActor_4.props)
val remoteActor = system.actorOf(MyActor_4.props, "remote_agent")
localActor ! PoisonPill
}
Système Acteur à distance
object RemoteActorSystem extends App {
import system.dispatcher
implicit val system = ActorSystem("remote-actorsystem")
// actors in this actor system are created remotely
println("hello.. remote agent is up")
}
Cela fait partie d'un code beaucoup plus base, et c'est le minimum que je pouvais trouver pour repl icate le problème.
Pourquoi mon système d'acteur local se comporte-t-il différemment et ne se ferme pas lors de la seconde invocation?
L'acteur local fait le
suivantobject MyActor_4 {
val props = Props[MyActor_4]
}
class MyActor_4 extends Actor with ActorLogging {
def receive = { case x: Any => log.error("unexpected message in reaper: " + x) }
override def postStop = { println ("shutting down...") ; context.system.terminate(); }
}
Remoting fonctionne bien, mais pour ce problème d'arrêt.
Pour arrêter l'ActorSystem, vous pouvez procéder de cette manière 'system.shutdown' Pour arrêter localActor & remoteActor sans arrêter le paramètre system.actorSection d'ActorSystem ("/user/* ")! PoisonPill' Peut vérifier cela pour plus de détails http://stackoverflow.com/questions/9356986/stop-all-actors-in-a-system-without-shutting-down-the-system-itself – Advika