Akka定義Actors和消息《two》譯

Akka定義Actors和消息

    消息(Messages)能夠是任意類型(任何Any的子類)。您能夠發送裝箱的原始值(例如String, Integer, Boolean等)做爲消息以及諸如數組和集合類型等普通數據結構。Case類和Case對象建立更優的消息,由於它們是不可改變的,而且支持模式匹配,有利於咱們在Actor中匹配所接收到的消息。html

    Hello World Actor 使用三種不一樣的 messages:api

  • WhoToGreet:接受問候語
  • Greet:執行問候語的指令
  • Greeting:包含問候語的消息

    當定義Actor及其Messages時,請記住如下建議:數組

  • 因爲消息是Actor的公開api,因此定義好名稱和豐富語義和特定域含義的消息是一個很好的實踐,即便它們只是封裝了數據類型。這將使使用、理解和調試基於Actor的系統變得更加容易。
  • 消息須要不可變的,由於他們會在不一樣線程之間分享。
  • 將Actor關聯的消息放在其同伴對象中是一種很好的實踐。這使得actor指望瞭解的消息類型和處理變得更加容易。
  • 在同伴對象使用了一個props方法,也是一個常見模式描述actor的構造。

    讓咱們看看的同伴對象和實現了Actor的Greeter和Printer實現如何演示這些最佳實踐。安全

    Greeter Actor的同伴對象:

    下面的代碼片斷是在AkkaQuickstart.scala中用來給同伴對象定義mesage被Greeter對象處理,而且定義了props方法微信

    「props方法」建立並返回一個props實例。props是一個配置類,用來指定建立actors的選項,認爲它是一個不可改變的、可自由共享的建立actor的方法,能夠包含相關的部署信息。這個示例簡單地傳遞了當構造時角色須要的參數。咱們將在本教程稍後看到「props方法」。數據結構

 Greeter Actor實現

下面的代碼片斷在AkkaQuickstart.scala,實現Greeter Actor:分佈式

    讓咱們分解這段功能:ide

  • Greeter繼承akka.actor.Actor,實現receive方法
  • 構造函數接受兩個參數:message:string,它將用於構建問候語消息和printerActor:ActorRef,它引用了處理問候語輸出的行爲者。
  • receive方法定義行爲,Actor應該如何應對接收到的不一樣消息。Actor能夠有狀態。訪問或改變一個Actor的內部狀態是徹底線程安全,由於它受到了Actor模型的保護。接收方法應該處理參與者指望的消息。在代碼中的狀況下,它指望兩種類型的消息:WhoToGreet和Greet。前者會更新greeting Actor的問候狀態,後者會觸發Printer Actor的問候。
  • greeting變量包含了角色的狀態,並設置爲默認狀況下爲""。

 Printer Actor 夥伴對象

    和Greeter相似,夥伴對象定義Printer Actor要處理的消息,定義 props方法和Actor指望的消息:函數

    Printer Actor的實現:優化

    Printer的實現很是簡單

  • 繼承akka.actor.ActorLogging自動獲取一個logger的引用,經過這樣作,咱們能夠在Actor中編寫log.info(),而無需添加任何附加導入或鏈接。   
  • 它只處理一種消息、問候語和記錄該消息內容。

    

    建立Actors

    到目前爲止,咱們已經研究了Actor及其message的定義。如今讓咱們深刻到位置透明性的力量,並看看如何建立Actor實例。

    位置透明性的力量

    在Akka中,您不能使用new關鍵字建立一個Actor實例。取而代之的,您可使用工廠建立Actor實例。工廠不會返回一個Actor實例,而是指向實例的引用,akka.actor.ActorRef這種間接方式在分佈式系統中增長了的力量和靈活性。

    在Akka中,並不關心位置。位置透明性意味着,在保留相同語義的同時,ActorRef在能夠表示進程中運行的Actor或遠程機器上的實例。若是須要,運行庫能夠經過更改Actor位置或運行時的整個應用程序拓撲來優化系統。這使得「let it crash」的失敗管理模型,系統能夠經過崩潰錯誤的Actors和重啓健康的故障管理來治癒本身。

    Akka ActorSystem

     akka.actor.ActorSystem factory 在某種程度上相似於Spring的BeanFactory。它充當Actor的容器,並管理他們的生命週期。在工廠方法建立Actor並獲取兩個參數,一個名爲「Props」和「name」的配置對象。

    Actor和ActorSystem名字在Akka中很重要。例如,您使用它們進行查找。使用與您的域模型相一致的有意義的名稱使得在道路上更容易地對它們進行理性的解釋。

    上一個話題回顧了helloworld Actor的定義。讓咱們來看看建立Greeter和Printer實例的AkkaQuickstart.scala文件中的代碼:

   

    注意到下面這些:

  • ActorSystem在actorOf方法建立了Printer角色。正如咱們在前面的主題中討論過的那樣,它使用了Printer夥伴對象的props方法來獲取props值。ActorRef提供了對新建立的Printer Actor實例的引用。
  • 對於Greeter,代碼建立了三個角色實例,每一個實例都帶有特定的問候消息。

    注意:在本例中,Greeter Actors實例都使用相同的Printer實例,可是咱們能夠建立多個Printer Actor實例。例子中使用一個示例來講明消息傳遞的一個重要概念,稍後咱們將介紹。

    接下來,讓咱們來看看如何與Actors溝通。

    原文:https://developer.lightbend.com/guides/akka-quickstart-scala/create-actors.html

    有什麼討論的內容,能夠加我微信公衆號:

相關文章
相關標籤/搜索