Akka初學1

package akka.scala

import akka.actor.{Actor, ActorSystem, Props}

/**
  * 定義 AkkaTest1 Actor
  * Created by liuwei on 2017/5/11.
  */
class AkkaTest1 extends Actor {
  /**
    * receive方法定義實現,其中使用了模式匹配表達式
    * 接收字符串Hello作爲消息,做出相應打印動作
    * @return
    */
  override def receive: Receive = {
    case "Hello" => println("world")
    case _ => println("no world")
  }
}

/**
  * 測試actor
  */
object Test1_AkkaTest1 extends App {
  //初始化一個actor系統
  //ActorSystem接收一個name參數,並且通過system.actorOf創建actor實例
  val system = ActorSystem("Test1_AkkaTest1")
  //初始化一個actor,Actor創建後自動運行
  val helloWorldActor = system.actorOf(Props[AkkaTest1], name = "helloWorld")
  //通過!方法來發送消息
  helloWorldActor ! "Hello"
  helloWorldActor ! "liuwei"
  helloWorldActor ! "Hello liuwei"
  // g關閉系統
  system.terminate()
}


Actor模型

Actor實例可以想象成是服務器上的Web服務,你無法控制,只能通過發送消息去請求執行任務或查詢信息,而不能直接在Web服務中修改狀態或者處理資源。通過發送不可改變的消息,雖然看上去有些限制,但是可以很簡單安全的編寫併發程序。

Actor系統的形象理解

一個actor是基於Actor系統的最小單元,就像面向對象系統中的對象實例一樣,它也封裝了狀態和行爲。我們無法窺探actor內部的信息,只能通過發送消息來請求狀態信息(就像是問一個人,他感覺如何)。actor中有一個存放不可變狀態信息的信箱。我們通過發送信息和actor進行通信,當actor收到信息之後,它會運用相關算法來處理具體的信息。 
在一個應用程序中,多個actor構成了一套層級系統,像是一個家族或者一個商業組織。一個actor可以認爲是一個商業組織的個人。一個actor有一個父親,稱爲監督者(supervisor),還有好多孩子,可以認爲,在一個商業組織中,主席(actor)下面有多個副主席,副主席也有很多下屬隨從。 
Actor系統的最佳實踐是“委派任務”,尤其是當actor的行爲被阻塞的時候。可以想象,在實際商業活動中,主席將要做的工作分配給下面的幾個副主席去分別執行,而副主席也會將子任務分配給自己的隨從,直到該任務被下屬們執行完畢。

處理故障

Actor模型的一個重要內容是處理故障。在工作工程中,如果出現錯誤或者拋出異常,actor和其子actor都將暫停,然後發送一條信息給監督者(supervisor)actor,報告出現故障的信號。 
根據工作任務和故障的性質,監督者actor將會作出幾種選擇:

  • 恢復下屬actor,保留內部狀態
  • 重啓下屬actor,清空狀態
  • 終止下屬actor
  • 上報故障

ActorSystem

一個actor system是actors的層級集團,分享公共配置信息(比如分發器dispatchers,部署deployments,遠程功能remote capabilities,地址addresses)。它同時也是創建和查詢actors的入口。ActorSystem是爲你的應用程序分配線程資源的結構。

ActorRef

當你調用ActorSystemactorOf方法時,將創建並返回一個ActorRef的實例: 
def actorOf(props: Props, name: String): ActorRef

這個引用用來處理actor,你可以將其看做是處理實際actor的代理人(broker)或包裝外觀(facade)。ActorRef防止你破壞Actor模型,比如直接處理Actor實例,或直接修改Actor實例中的變量。所以只能通過給actor發送消息方式來執行任務,這種“袖手旁觀(不干涉,hands-off)”的方法幫助鞏固適宜的編程實踐。

ActorRef有以下特點:

  • 它是不可變的
  • 它與actor實體是一對一的關係
  • 它是可序列化的,網絡可感知的。這使得你可以在網絡環境中傳送一個ActorRef
http://blog.csdn.net/JasonDing1354/article/details/50533113


發佈了177 篇原創文章 · 獲贊 510 · 訪問量 53萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章