2017-03-27 5 views
0

J'ai la confusion sur ce qui est la séquence des messages est arrivé dans la boîte aux lettres dans le code suivant:Séquence d'arrivée de messages dans la boîte aux lettres de l'acteur lors de l'utilisation ask et tell

class myAct extends Actor { 
def receive = { 
    case 1 => 
    println(1) 
    case 2 => 
    sender ! 90 
    case 3 => 
    println(3) 
} 

}

Dans le pilote que j'envoie des messages à l'acteur

myActor ! 1 
myActor.ask(2).mapTo[Int].onComplete { 
case Success(x) => 
    println(x) 
case Failure(ex) => 
    println(ex)} 
myActor ! 3 

la question est dans quel ordre seront les messages livrés à la boîte aux lettres. Je vais toujours arriver en premier. arrivera toujours en dernier. Y a-t-il une possibilité d'arriver 2 avant 1.

Répondre

0

Il existe une section spécifique de la documentation sur Message Ordering. Si votre "pilote" est un autre acteur, alors la commande est claire. De la documentation:

La règle plus particulièrement est que pour une paire donnée d'acteurs, messages envoyés directement à partir de la première à la seconde ne sera pas reçu hors commande. Le mot souligne directement que cette garantie ne s'applique qu'à l'envoi avec l'opérateur tell à la destination finale , et non lorsqu'il utilise des médiateurs ou d'autres fonctionnalités de diffusion de message (sauf indication contraire).

Si le pilote est pas à l'intérieur d'un acteur alors default implicit sender est Actor.noSender. Selon le commentaire de Konrad, il semble que la commande soit toujours préservée dans ce cas également.

+0

La commande est toujours garantie quand '!' Puis '?' Est fait à partir d'un non-acteur. C'est aussi simple que "! Cela arrivera avant?". FYI '?' Est juste un special '!' De toute façon - cela fait des choses quand il reçoit une relpy dans un acteur spécial qui est créé quand vous le faites. –

+0

@ Konrad'ktoso'Malawski Réponse mise à jour en conséquence, merci pour la clarification. –