在寫散文時,最難的部分每每是編寫前幾句話。在開始構建Akka系統時,有一種相似的「空白畫布」的感受。你可能想知道:哪一個應該是第一個Actor?它應該住在哪裏?它該怎麼辦?幸運的是 - 與散文不一樣,已創建的最佳實踐能夠指導咱們完成這些初步步驟。在本指南的其他部分,咱們將研究一個簡單的Akka應用程序的核心邏輯,向您介紹Actor並向您展現如何使用它們制定解決方案。該示例演示了可幫助您啓動Akka項目的常見模式。html
您應該已經按照Akka Quickstart with Java guide指南中的說明下載並運行Hello World示例。您將使用它做爲種子項目並添加本教程中描述的功能。java
在本教程中,咱們將使用Akka構建物聯網(IoT)系統的一部分,該系統報告來自客戶家中安裝的傳感器設備的數據。該示例着重於溫度讀數。目標用例容許客戶登陸並查看他們家中不一樣區域的最後報告溫度。您能夠想象這樣的傳感器還能夠收集相對溼度或其餘有趣的數據,而且應用程序可能支持讀取和更改設備配置,甚至可能在傳感器狀態超出特定範圍時警告房主。瀏覽器
在真實系統中,應用程序將經過移動應用程序或瀏覽器向客戶公開。本指南僅關注用於存儲將經過網絡協議調用的溫度的核心邏輯,例如HTTP。它還包括編寫測試,以幫助您得到測試Actor的溫馨和熟練。安全
教程應用程序包含兩個主要組件:網絡
下圖說明了示例應用程序體系結構。因爲咱們對每一個傳感器設備的狀態感興趣,所以咱們將設備設計爲Actor。正在運行的應用程序將根據須要建立儘量多的設備Actor和設備組實例。ide
本教程介紹並說明:學習
讓咱們開始學習更多關於Actor的內容。測試
使用Akka能夠減輕您爲actor系統建立基礎結構的麻煩,也能夠減小編寫控制基本行爲所需的低級代碼。爲了理解這一點,讓咱們看一下您在代碼中建立的actor與Akka在內部爲您建立和管理的actor之間的關係,actor生命週期和失敗處理。
ui
Akka的Sctor老是屬於他的父母。一般,您經過調用getContext().actorOf()來建立actor。這不是建立一個「獨立」Actor,而是將新Actor做爲孩子注入已經存在的樹中:建立者Actor成爲新建立的子演員的父級。你可能會問,你建立的第一個Actor的父母是誰?spa
以下圖所示,全部Actor都有一個共同的父母,即用戶監護人。可使用system.actorOf()在此actor下建立新的actor實例。正如咱們在快速入門指南中所述,建立actor會返回一個有效URL的引用。所以,例如,若是咱們使用system.actorOf(...,「someActor」)建立一個名爲someActor的actor,它的引用將包含路徑 / user / someActor
實際上,在代碼中建立actor以前,Akka已經在系統中建立了三個actor。這些內置Actor的名字包含監護人,由於他們監督他們路徑中的每一個兒童Actor。監護人演員包括:
在Hello World示例中,咱們已經看到system.actorOf()如何直接在/ user下建立一個actor。咱們將其稱爲頂級actor,儘管實際上它只位於用戶定義的層次結構的頂部。您的ActorSystem中一般只有一個(或極少數)頂級actor。咱們經過從現有actor調用context.actorOf()來建立子級或非頂級actor。context.actorOf()方法的簽名與system.actorOf()相同,後者是它的頂級對應物。
查看actor層次結構的最簡單方法是打印ActorRef實例。在這個小實驗中,咱們建立一個actor,打印它的引用,建立這個actor的子元素,並打印子元素的引用。咱們從Hello World項目開始,若是您尚未下載它,請從Lightbend Tech Hub下載Quickstart項目。
在Hello World項目中,導航到com.lightbend.akka.sample包並在此處建立一個名爲ActorHierarchyExperiments.java的新Java文件。將如下代碼段中的代碼複製並粘貼到此新源文件中。保存文件並運行sbt「run Main com.lightbend.akka.sample.ActorHierarchyExperiments」以觀察輸出。
請注意消息要求第一個Actor執行其工做的方式。咱們使用父級的引用發送消息:firstRef.tell(「printit」,ActorRef.noSender())。當代碼執行時,輸出包括第一個actor和它做爲printit case的一部分建立的子節點的引用。您的輸出應相似於如下內容:
如今您已經瞭解了actor層次結構的樣子,您可能想知道:爲何咱們須要這種層次結構?它是幹什麼用的?
層次結構的一個重要做用是安全地管理actor的生命週期。讓咱們接下來考慮一下,看看這些知識如何幫助咱們編寫更好的代碼。
原文:https://doc.akka.io/docs/akka/current/guide/tutorial.html
有什麼討論的內容,能夠加我公衆號: