2017-01-09 40 views
0

我已經閱讀了很多演員定義類的例子來構建一個程序。我注意到的是他們都使用ActorRef作爲參數類型。例如,爲什麼akka actor使用ActorRef作爲參數的類型而不是類型本身?

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的實際類型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,out程序看起來就像是一個弱類型系統。
此外,Akka演員使用actorOf方法創建小孩演員並返回ActorRef.I也混淆爲什麼不返回演員的真實類型?

+2

所有這一切都在阿卡文檔解釋溝通其他演員:HTTP:// DOC .akka.io/docs/akka/2.4/general/actors.html – Ryan

回答

0

關於演員的一些評論:

  • 我們可以通過調用actorOf或創建一個演員的很多實例actorFor
  • 我們分配一個不同的名稱,以任何演員實例中,我們創建
  • 調用actorOf將返回ActorRef指向該實例
  • 您只能通過ActorRef發送消息來與Actor的實例進行通信,這樣就可以封裝actor實例並且無法訪問其內部狀態
  • 使用ActorRef允許您與本地或遠程演員
  • 每個演員(孩子)有一個父別的演員,父母是誰創造了使用actorOf
  • 父男主角一個人決定的監督戰略溝通其子
  • 通常,你創建一個演員的一個實例,並共享結果ActorRef與誰希望與演員
+0

我認爲關鍵是第四個,其他參考如果使用實型,那麼s也可以工作,因爲實型是'ActorRef'的子類。 – LoranceChen

+0

此外,我真的希望Akka Actor需要IDE /代碼提示來跟蹤ActorRef的定義位置。 – LoranceChen

相關問題