2017-02-02 39 views
1
import akka.actor.{ Actor, Props, Terminated } 

class WatchActor extends Actor { 
    val child = context.actorOf(Props.empty, "child") 
    context.watch(child) // <-- this is the only call needed for registration 
    var lastSender = context.system.deadLetters 

    def receive = { 
    case "kill" => 
     context.stop(child); lastSender = sender() 
    case Terminated(`child`) => lastSender ! "finished" 
    } 
} 

我在這裏對Terminated消息感到困惑。終止消息的目的是什麼

當一個演員創建一個小孩演員時,是不是默認它已經在看? 如果該小孩演員過早死亡,默認策略是重新啓動它的正確性?

上述代碼段中Terminated消息的用途是什麼? (取自akka網站:http://doc.akka.io/docs/akka/2.4/scala/actors.html

如果小孩演員終止,WatchActor會得到該消息?但它是發送lastSender()「完成」的消息,而lastSender是這個情況下的小孩演員嗎?

回答

1

目的是從兒童演員死亡時獲得通知。 談起例如在阿卡文檔,lastSender是發送一個消息給watchActor演員:委託殺死進程

lastSender ----"kill"---> watchActor ---context.stop---> child 
       <--"finished--    <--Terminated------ 

所以,lastSender是已經發送了「殺」的消息(串)演員。這是不一樣的child,和不一樣的watchActor

另一個缺點是,中間WatchActor(一種「殺手」,而不僅僅是監測)可能無法創建子原來,這就是爲什麼它有訂閱的生命週期演員的命名爲「孩子」,因爲你可以從例子中看到:

val child = context.actorOf(Props.empty, "child") 
context.watch(child) 

PS如果你問我關於這樣複雜的協議的目的,我的猜測是它是面向對象的單一責任。然而,海事組織,我從來不喜歡阿卡用生命週期的東西來扭曲原有的演員的概念(IO協議和狀態處理)。然而,這就是你用Akka得到的東西 - 它對於流式庫(akka-streams,fs2,monix)來說更簡單一些,所以如果它適合你的目的,你可以嘗試它們。

+0

這是真的,但我想如果孩子的演員是由watchActor創建的,它不需要顯式調用context.watch。如果它是另一個演員,那麼對我來說是有道理的。 –

+0

@coolbreeze是的,阿卡的做法有點「深奧」,我添加了一些小的「P.S.」。關於它,但當然要用一粒鹽來表達我的意見:) – dk14