2017-01-09 7 views
0

Я прочитал много примеров определения класса участников для создания программы. Я замечаю, что все они используют тип ActorRef. Например,Почему аккор-актер использует ActorRef как тип paramater, а не сам тип?

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 ! _) 
    } 
} 

фактический тип по dbWriter «s является DBWriter определяется как:

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

На примере, почему бы не использовать DbWriter как тип dbWriter в?
Если мы используем ActorRef в любом месте, программа просто выглядит как система слабого типа.
Кроме того, аккерский актер использует метод actorOf для создания дочернего актера, и он возвращает ActorRef.I также путают, почему бы не вернуть реальный тип актера?

+2

Все это объясняется в документации Akka: HTTP: // документ .akka.io/docs/akka/2.4/general/actors.html – Ryan

ответ

0

Некоторые комментарии по поводу актеров:

  • Мы можем создать много примеров актера по телефону actorOf или actorFor
  • Мы присвоить другое имя любого экземпляра актера мы создаем
  • Вызов actorOf будет возвращать ActorRef, указывающий на этот экземпляр
  • Вы общаетесь только с экземпляром Актера, отправляя сообщения через свой ActorRef, таким образом экземпляр актера инкапсулируется и нет доступа к его внутреннему состоянию
  • Использование ActorRef позволяет общаться с местными или дистанционными актерами
  • Каждый актер (ребенок) имеет один из родителей (другой актер), родитель является тот, кто создал актер с помощью actorOf
  • Родитель определяет стратегию надзора своих детей
  • Обычно, вы создаете один экземпляр актера и разделить полученную ActorRef с другими актерами, которые хотят общаться с этим актером
+0

Я думаю, что ключ четвертый и другие s может также работать, если используется реальный тип, потому что реальный тип является подклассом 'ActorRef'. – LoranceChen

+0

Кроме того, я очень надеюсь, что Акка Актеру нужны подсказки IDE/Code для отслеживания ActorRef, где он был определен. – LoranceChen