Akka的Hello World(一)Akka的Actor架构
一、?Actor層次結構
Akka的Actor總會有他的父母。通常,您通過調用getContext().actorOf()創建一個actor 。這不是創建一個“獨立”Actor,而是將新Actor作為孩子注入已經存在的樹中:創建者Actor成為新創建的子Actor的父級。那么你可能會問,你創建的第一個Actor的父母是誰?
Akka的Actor總是屬于父母。通常,您通過調用getContext().actorOf()創建一個actor 。這不是創建一個“獨立”Actor,而是將新Actor作為孩子注入已經存在的樹中:創建者Actor成為新Actor的子Actor的父級。那么你可能會問,你創建的第一個Actor的父母是誰?
如下圖所示,所有Actor都有一個共同的父母,即用戶監護人。可以在此actor下使用system.actorOf()創建新的actor實例.創建actor會返回一個有效URL的引用。
例如:如果我們通過system.actorOf(…, "someActor")創建一個someActor,其參考將包括路徑/user/someActor
?
實際上,在代碼中創建Actor之前,Akka已經在系統中創建了三個actor。這些內置Actor的名字包含guardian ,因為他們監督他們路徑中的每個子Actor。guardian Actor包括:
- ?/ 所謂的根守護者。這是系統中所有actor的父級,也是系統本身終止時停止的最后一個。
- /user?的監護人。這是所有用戶創建的actor的父actor。不要讓名稱user混淆你,它與最終用戶無關,也與用戶處理無關。使用Akka庫創建的每個actor都會在其/user/前面加上常量路徑。
- /system?該系統的監護人。
二、代碼測試
(一)首先建立maven工程
(二)添加依賴,創建類
<dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.22</version> </dependency>如圖所示:
?
(三)編寫代碼
import akka.actor.AbstractActor; import akka.actor.AbstractActor.Receive; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props;class PrintMyActorRefActor extends AbstractActor {static Props props() {return Props.create(PrintMyActorRefActor.class, PrintMyActorRefActor::new);}@Overridepublic Receive createReceive() {return receiveBuilder().matchEquals("printit",p -> {ActorRef secondRef = getContext().actorOf(Props.empty(), "second-actor");System.out.println("Second: " + secondRef);}).build();} } public class ActorHierarchyExperiments {public static void main(String[] args) throws java.io.IOException {ActorSystem system = ActorSystem.create("testSystem");ActorRef firstRef = system.actorOf(PrintMyActorRefActor.props(), "first-actor");System.out.println("First: " + firstRef);firstRef.tell("printit", ActorRef.noSender());System.out.println(">>> Press ENTER to exit <<<");try {System.in.read();} finally {system.terminate();}} }(四)運行
(五)分析
代碼比較簡單。在main函數中firstRef向Actor發送了一條消息。Actor收到消息后進行了處理。
- 兩條路徑都以akka://testSystem/。由于所有Actor引用都是有效的URL,因此akka://是協議字段的值。
- 接下來,就像在萬維網上一樣,用URL標識系統。在此示例中,系統已命名testSystem,但它可以是任何其他名稱。如果啟用了多個系統之間的遠程通信,則URL的這一部分包含主機名,以便其他系統可以在網絡上找到它。
- 因為第二個actor的引用包含路徑/first-actor/,所以它將其標識為第一個的子節點。
- Actor的最后一部分,#后邊的一連串數字是在大多數情況下可以忽略的唯一標識符。
?
總結
以上是生活随笔為你收集整理的Akka的Hello World(一)Akka的Actor架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Akka入门(二)Akka的Actor模
- 下一篇: Akka的Hello World(二)A