2017-01-04 2 views
0

Veuillez regarder le code ci-dessous et expliquez pourquoi ma sortie pointe vers deadLetters. sender() pointant vers une lettre morte pour le message du système d'acteur

class DemoActor extends Actor { 
    def receive = { 
    case "foo" => println(sender()) 
    } 
} 


object Main extends App { 
    val actorSystem = ActorSystem("DemoSystem") 
    val demoActorRef = actorSystem.actorOf(Props[DemoActor]) 
    demoActorRef ! "foo" 
} 

Sortie:

Actor[akka://DemoSystem/deadLetters] 

Merci à l'avance

+0

Sûrement parce que vous ne l'appelez pas d'un autre acteur, donc il n'y a nulle part où répondre? (donc il ne serait pas judicieux d'avoir un expéditeur) – Clint

+0

Donc, seulement lorsqu'un acteur B est appelé par un autre acteur A, l'expéditeur() sera l'acteur A. Est-ce correct? –

Répondre

2

En effet, le système d'acteur ne dispose pas d'une boîte aux lettres que les réponses peuvent être détachés.

La référence de l'expéditeur est utilisée pour envoyer des réponses sans que l'acteur contacté ait besoin de savoir qui l'a appelé, ainsi que le mécanisme de demande.

Vous pouvez voir cela en pratique en essayant le même appel d'un autre acteur par rapport au système, et vous verrez que la référence de l'expéditeur est valide lorsqu'elle est appelée par un autre acteur.