akka Actor

 

 

上層actor模型:Actor, ActorCell, ActorContext, ActorRef關係

Actor是用戶態定義的類型,用戶能夠看到的Actor都是從這個類型來的。用戶能看到的actor是trait akka.actor.Actor,這個只是actor對外的一個門面,actor要訪問actor系統內部的功能,基本上都要通過ActorContext來訪問。

ActorCell是actor的內部表示,實現了ActorContext這個trait,所有的功能基本上都是在ActorCell提供的。ActorCell佔用64字節。ActorContext是從actor的角度看到的ActorCell的視圖,提供了設置接收超時、自身引用、become/unbecome、獲取sender引用、獲取children引用列表、獲取MessageDispatcher、獲取ActorSystem、獲取parent引用、watch/unwatch一個actor的方法,因ActorContext繼承了ActorRefFactory,所以也有actorOf、actorFor等創建/獲取actorRef的能力。Actor/ActorCell和enipcore的Service/ServiceBase概念一模一樣,都是一個是系統外面向用戶的,一個是系統內進行調度的。

ActorRef是用戶看到的對Actor的引用,任何對actor的訪問,都是通過ActorRef來的。ActorRef提供了獲取path、tell/forward消息的功能。實際上內部是使用一個InternalActorRef來表示ActorRef的,InternalActorRef繼承自ActorRef,提供了Actor生命週期管理的接口。LocalActorRef實現了InternalActorRef,是本節點中真正的actorRef實現,其中會創建並啓動ActorCell。

ActorSystem在創建時,LocalActorRefProvider會創建rootGuardian(根actor),然後rootGuardian下會創建面向用戶態actor的guardian,這兩個都是InternalActorRef,是通過直接new LocalActorRef創建出來的,這兩個guardian的Actor類都是Guardian。在actor內部創建子actor時,執行的是context.actorOf方法,context實際上就是ActorCell,ActorCell.actorOf調用了LocalActorRefProvider.actorOf方法,直接new一個LocalActorRef出來,而新創建的LocalActorRef會創建ActorCell,並調用其start方法,ActorCell.start方法中,將創建mailbox,並向mailbox中發送一個Create系統消息,然後讓dispatcher開始調度mailbox。執行ActorSystem.actorOf方法創建actor時,實際上向guardian這個Actor發送CreateChild消息,讓它創建一個actor。guardian在收到CreateChild消息時,調用context.actorOf方法創建新actor,這個就與在actor內部創建子actor的做法一樣了。

 

轉自:http://spartan1.iteye.com/blog/1641322

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章