2016-06-07 1 views
0

Si je désactive la ligne A, l'application HelloRemote ne peut pas recevoir le message "bonjour monde", il semble que si nous fermons trop vite le système d'acteur local, le message ne sera pas envoyé à distance?Quel est le moyen de fermer le client distant akka

Bien sûr, l'acteur local pourrait attendre un message de la part de la télécommande pour confirmer le message déjà reçu, mais si nous ajoutons un tel code, le processus sera synchrone, je ne veux pas que ça devienne RPC.

Je veux juste le rendre asynchrone, et aussi ne veux pas perdre de temps par "Thread.sleep (3000)", je veux que le client quitte le plus vite possible, une suggestion?

HelloRemote.scala

package remote 

import akka.actor._ 

object HelloRemote extends App { 
    val system = ActorSystem("HelloRemoteSystem") 
    val remoteActor = system.actorOf(Props[RemoteActor], name = "RemoteActor") 
} 

class RemoteActor extends Actor { 
    def receive = { 
    case msg: String => 
     println(s"received message '$msg'") 
    } 
} 

Local.scala

package local 

import akka.actor._ 

object Local extends App { 
    val system = ActorSystem("LocalSystem") 
    val localActor = system.actorOf(Props[LocalActor], name = "LocalActor") 
    localActor ! "START" 
} 

class LocalActor extends Actor { 
    val remote = context.actorSelection(
    "akka.tcp://[email protected]:5150/user/RemoteActor") 

    def receive = { 
    case "START" => 
     remote ! "hello world" 
     Thread.sleep(3000) // Line A 
     context.stop(self) 
     context.system.shutdown 
    } 
} 

En outre, la pâte application.conf pour votre essai facile.

partie à distance:

akka { 
     actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
     } 
     remote { 
     netty.tcp { 
      hostname = "127.0.0.1" 
      port = 5150 
     } 
     log-remote-lifecycle-events = off 
     } 
     log-dead-letters = off 
     log-dead-letters-during-shutdown = off 
    } 

partie locale:

akka { 
     actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
     } 
     remote { 
     log-remote-lifecycle-events = off 
     } 
     log-dead-letters = off 
     log-dead-letters-during-shutdown = off 
    } 
+0

Au lieu de 'context.stop (auto)', vous pouvez envoyer un message 'PoisonPill' à soi-même, retirer la ligne A et à la réception de' PoisonPill' message que vous pouvez éteindre le système – curious

+0

@curious, je me demande comment puis-je faire mon action après soi-même! PoisonPill, il semble, Akka va gérer ce message par lui-même, donc quelque chose comme prochaine ne fonctionne pas. case PoisonPill => println ("wow") – lagom

+0

Corriger, Faire 'case object' pour un message personnalisé comme' KillLocal' et l'envoyer à 'self' et à la réception de' KillLocal' faire 'context.stop (self)'; 'context.system.shutdown' – curious

Répondre

0

Comme la chose plus simple, l'acteur distant peut renvoyer pilule empoisonnée au client local.

Comme ceci:

sender ! Kill 

vous pouvez lire ici http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Killing_an_Actor

Ou vous pouvez choisir un certain message « secret » qui racontent votre acteur local de faire quelque chose avant de s'arrêter.

Exemple court. partie à distance:

class RemoteActor extends Actor { 
    def receive = { 
    case msg: String => 
       println(s"received message '$msg'") 
       sender ! "secretWord" 
    }  
} 

partie locale:

class LocalActor extends Actor { 
    val remote = context.actorSelection(
    "akka.tcp://[email protected]:5150/user/RemoteActor") 

    def receive = { 
     case "START" => 
      remote ! "hello world" 
     case "secretWord" => 
     context.stop() 
    } 

    def postStop(): Unit = { 
    //do something here 
    } 
} 
+0

OP déjà mentionné, il ne veut pas que l'acteur local attende une confirmation de l'acteur à distance et ensuite agir sur elle, – curious

+0

Je pense qu'il ne peut pas le faire sans obtenir un message de l'acteur à distance. Une autre chose que je peux suggérer est "demander", mais dans ce cas, nous devons attendre une réponse de l'acteur à distance. Si quelqu'un maintenant comment le faire, dites-nous s'il vous plaît. –

+0

Après avoir envoyé un message à un acteur distant, vous pouvez envoyer un PoisonPill à vous-même qui servira le but. – curious