2017-08-14 1 views
-2

J'ai deux acteurs par exemple, l'expéditeur:Je veux envoyer deuxième message à l'acteur en tant que nouveau message

class ActorSender(actroReciever: ActorRef) extends Actor{ 
    implicit val timeout = Timeout(100, TimeUnit.SECONDS) 

    override def receive: Receive = { 
    case "RUN" => { 
     val resp = Await.result(actroReciever ? "Msg", 100.seconds) 
     println("receive response " + resp) 
    }; 
    case str:String => println(str) 
    case _ => println("Error type msg") 
    } 
} 

recepteur:

class ActroReciever extends Actor{ 
    override def receive: Receive = { 
    case str:String => { 
     val snd = sender() 
     snd ! "MessageFirst" 
     snd ! "MessageSecond" 
    } 
    } 
} 

et classe pour le démarrage:

object Tester extends App { 
    val system = ActorSystem("system") 
    val receiver = system.actorOf(Props[ActroReciever](new ActroReciever()), "receiver") 
    val sender = system.actorOf(Props[ActorSender](new ActorSender(receiver)), "sender") 
    sender ! "RUN" 
} 

Je veux envoyer deux messages à sender(), d'abord comme réponse pour "demander", deuxième message comme "nouveau message", que ActorSender exécuter comme "correspondant", comment je peux le faire? Merci

Répondre

2

D'abord, vous savez que vous ne devriez pas utiliser Await, non?

Deuxièmement, ask (?) n'est pas destiné à être utilisé dans les acteurs. ask crée un acteur temporaire qui ne peut recevoir qu'un seul message. Ce n'est pas votre ActorSender qui reçoit la réponse, mais l'acteur temporaire créé par ask. C'est pourquoi vous avez le sentiment que vous ne pouvez envoyer qu'une seule réponse.

Vous vous trompez, vous devez simplement envoyer votre message en utilisant actroReciever ! "Msg". Pas besoin de changer quoi que ce soit sur votre ActroReciever.