2017-08-14 10 views
-2

ich zwei Schauspieler zum Beispiel Absender haben:Ich will als neue Nachricht zweite Nachricht an Schauspieler senden

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") 
    } 
} 

Empfänger:

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

und Klasse zum Starten:

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" 
} 

Ich möchte zwei Nachrichten an sender() senden, zuerst als Antwort für "ask", zweite Nachricht als "new Message", welche ActorSender als "matching" ausführen, wie kann ich es tun? Danke

Antwort

2

Zuerst wissen Sie, dass Sie nicht Await verwenden sollten, richtig?

Zweitens, ask (?) ist nicht zur Verwendung innerhalb von Schauspielern gedacht. ask erstellt einen temporären Akteur, der nur eine einzige Nachricht empfangen kann. Es ist nicht Ihre ActorSender Erhalt der Antwort, sondern der temporäre Akte von Ask erstellt. Deshalb haben Sie das Gefühl, Sie können nur eine Antwort senden.

Sie tun dies falsch, Sie sollten einfach Ihre Nachricht senden mit actroReciever ! "Msg". Keine Notwendigkeit, etwas an Ihrem ActroReciever zu ändern.

Verwandte Themen