天天看點

Akka并發程式設計——第四節:Actor模型(三)

本将主要内容:

1. actor引用、actor路徑

下圖是akka官方文檔中給出的一張圖

Akka并發程式設計——第四節:Actor模型(三)

該圖清晰地說明了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等大資料技術幹貨及相關技術資訊。技術永無止境,勇攀高峰,一往直前!

覺得文章不錯?掃描關注

Akka并發程式設計——第四節:Actor模型(三)