2017-01-09 2 views
0

J'ai lu plusieurs exemples de définition de classe d'acteurs pour construire un programme. Ce que je remarque est qu'ils utilisent tous ActorRef comme type de paramètres. Par exemple,Pourquoi l'acteur akka utilise-t-il ActorRef comme type de paramètre plutôt que le type lui-même?

class LogProcessor(dbWriter: ActorRef) 
    extends Actor with ActorLogging with LogParsing { 

    import LogProcessor._ 

    def receive = { 
     case LogFile(file) => 
     val lines: Vector[DbWriter.Line] = parse(file) 
     lines.foreach(dbWriter ! _) 
    } 
} 

le type réel de dbWriter est DBWriter défini comme:

class DbWriter(databaseUrl: String) extends Actor { 
    val connection = new DbCon(databaseUrl) 

    import DbWriter._ 
    def receive = { 
     case Line(time, message, messageType) => 
     connection.write(Map('time -> time, 
      'message -> message, 
      'messageType -> messageType)) 
    } 

    override def postStop(): Unit = { 
     connection.close() 
    } 
    } 

l'exemple, pourquoi ne pas utiliser DbWriter comme type de dbWriter?
Si nous utilisons ActorRef n'importe où, le programme externe ressemble à un système de type faible.
En outre, l'acteur Akka utilise la méthode actorOf pour créer un acteur enfant et le retour ActorRef.I aussi confondre pourquoi ne pas retourner le type réel de l'acteur?

+2

Tout cela est expliqué dans les documents Akka: http: // doc .akka.io/docs/akka/2.4/general/actors.html – Ryan

Répondre

0

Quelques commentaires sur les acteurs:

  • Nous pouvons créer de nombreux cas, d'un acteur en appelant actorOf ou actorFor
  • Nous attribuons un nom différent à une instance d'acteur, nous créons
  • appel actorOf renverra une ActorRef qui pointe vers cette instance
  • Vous ne communiquez qu'avec une instance d'acteur en envoyant des messages via son ActorRef, de cette façon l'instance d'acteur est encapsulée et il n'y a aucun moyen d'accéder à son état interne
  • Utilisation du ActorRef vous permet de communiquer avec des acteurs locaux ou distants
  • Chaque acteur (enfant) a l'un des parents (un autre acteur), le parent est celui qui a créé l'acteur en utilisant actorOf
  • Le parent décide de la stratégie de surveillance de ses enfants
  • Généralement, vous créez une instance d'un acteur et de partager la ActorRef résultant avec d'autres acteurs qui souhaitent communiquer avec cet acteur
+0

Je pense que la clé est la quatrième et d'autres réfèrent s peut aussi fonctionner si utiliser un type réel car le type réel est une sous-classe de 'ActorRef'. – LoranceChen

+0

En outre, j'espère vraiment Akka Actor besoin d'un IDE/Code conseils pour suivre l'ActorRef où il a été défini. – LoranceChen