2013-07-14 4 views

Répondre

86

copié sans vergogne [impressionnant]official doc (regarder Envoyer des messages section pour plus):

Les messages sont envoyés à un acteur par l'une des méthodes suivantes.

! signifie "ignorer", par ex. envoyer un message de manière asynchrone et retourner immédiatement. Également connu sous le nom tell. De manière asynchrone, un message est renvoyé et Future représente une réponse possible. Également connu sous le nom ask.

17

Du point de vue du destinataire, il voit tell et ask messages de la même façon. Toutefois, lors de la réception d'un tell la valeur de sender sera la référence de l'acteur qui a envoyé le message, alors que pour un ask, le sender est configuré de sorte que toute réponse soit envoyée au Future créé dans l'acteur qui a fait la demande.

ask est un avantage, il est facile de savoir que la réponse que vous recevez est certainement le résultat du message que vous avez demandé, alors qu'avec Tell, vous devrez peut-être utiliser des ID uniques pour obtenir un résultat similaire . Cependant, avec ask, vous devez définir un timeout, après quoi le Future échouera si aucune réponse n'est reçue.

Dans le code ci-dessous, le même effet est atteint avec tell et ask.

import akka.actor.{Props, Actor} 
import scala.concurrent.duration._ 
import akka.pattern.ask 

class TellActor extends Actor { 

    val recipient = context.actorOf(Props[ReceiveActor]) 

    def receive = { 
    case "Start" => 
     recipient ! "Hello" // equivalent to recipient.tell("hello", self) 

    case reply => println(reply) 
    } 
} 

class AskActor extends Actor { 

    val recipient = context.actorOf(Props[ReceiveActor]) 

    def receive = { 
    case "Start" => 
     implicit val timeout = 3 seconds 
     val replyF = recipient ? "Hello" // equivalent to recipient.ask("Hello") 
     replyF.onSuccess{ 
     case reply => println(reply) 
     } 
    } 
} 

class ReceiveActor extends Actor { 

    def receive = { 
    case "Hello" => sender ! "And Hello to you!" 
    } 
} 
Questions connexes