2017-01-23 3 views
0

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

  1. crée deux acteurs, l'un sur le système local et un sur le
  2. 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

suivant
object 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.

Répondre

0

Selon ma compréhension ci-dessous, la ligne de code n'arrêterait pas RemoteActor. Parce que PoisonPill arrête l'acteur expéditeur et tous ses acteurs enfants, car PoisonPill l'arrête. Ici, remoteActor n'est pas un acteur enfant de localActor. pourriez-vous partager les journaux où les deux acteurs du système d'acteurs locaux s'arrêtent en première manche?

+0

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