本将主要内容:
1. actor引用、actor路徑
下圖是akka官方文檔中給出的一張圖

該圖清晰地說明了actorpath,actorref,actor及actorsystem之間的關系,并說明了actor整體的層次結構。前面我們提到,akka應用程式會持有一個名稱為user的actor,該actor被稱為guardian supervisor(守衛監督器),無論是actorsystem建立的actor還是通過actorcontext建立的actor都為user的子類,它是最頂級的actor。
對于actorref,我們已經很熟悉了,通過調用actorsystem.actorof方法可以建立actor,傳回的便是actorref,例如代碼
傳回的便是firstactor的actorref對象,actorref最重要的作用便是向actor發送消息,例如
另外,還可以通過context隐式對象擷取父actor和子actor的actorref,示例代碼如下:
代碼運作結果
代碼
中,使用
擷取myactor 的直接父actor的actorref,在本例中為firstactor,因為在firstactor中,我們使用
建立了myactor,firstactor便自動成為myactor的直接supervisor。如此便可以通過代碼
發送消息。
另外,還可以通過
system.actorselection(myactorpath)方法擷取相應的actorref。然後再使用擷取到的actorref向acto發送消息
現在,讓我們來總結一下擷取actorref的方法:
(1)通過actorsystem的actorof方法,不過這種方式是通過建立actor,然後傳回其actorref
(2)通過context.actorof方法,這種方式也是通過建立actor,然後傳回其actorref
(3)通過context.parent、context.self、context.children方法擷取目前actor的父actor、目前actor及子actor的actorref,這種方式是擷取已經建立好的actor的actorref
(4)通過val myactor1=system.actorselection(myactorpath)方法來擷取actorref,這種方式也是擷取已經建立好的actor的actorref
在前面的例子中,我們通過
已經使用到了actorpath。在akka中,actorpath采用統一資源定位符的方式進行組織,例如
本地actorpath是akka并發程式設計中的actorpath表示方式,而遠端actorpath是akka分布式程式設計中常用的actorpath表示方式,”akka.tcp://[email protected]:5678/user/service-b”中的tcp表示使用的是tcp協定,也可以使用upd協定,使用udp協定的遠端actorpath表示方式有如下形式
actorpath當中,akka.udp表示的是使用的協定,my-sys表示的是actorsytem名稱,host.example.com:5678為遠端機器位址及端口,user為guardian supervisor,service-b為目前應用程式的頂級actor(通過system.actorof方法建立的)
代碼運作結果:
本例中的重點代碼如下
通過 val firstactorpath=system.child(“firstactor”)構造一個actorpath,然後使用
擷取路徑下的actorref,除這種方式外,還可以通過絕對路徑 val myactor2=system.actorselection(“/user/firstactor”)及相對路徑 val myactor3=system.actorselection(“../firstactor”)的方式擷取actorref
,需要注意的是絕對路徑使用的是guardian supevisor,即/user/firstactor的這種方式。
如果要擷取myactor,則基方法是類型的,例如
完整代碼如下:
關于遠端actorref的擷取,我們将在後續章節中進行講述。
scala學習(公衆微信号:scalalearning)每天為大家帶來一點scala語言、spark、kafka、flink、akka等大資料技術幹貨及相關技術資訊。技術永無止境,勇攀高峰,一往直前!
覺得文章不錯?掃描關注