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
當你調用ActorSystem
的actorOf
方法時,將創建並返回一個ActorRef
的實例: def actorOf(props: Props, name: String): ActorRef
。
這個引用用來處理actor,你可以將其看做是處理實際actor的代理人(broker)或包裝外觀(facade)。ActorRef防止你破壞Actor模型,比如直接處理Actor實例,或直接修改Actor實例中的變量。所以只能通過給actor發送消息方式來執行任務,這種“袖手旁觀(不干涉,hands-off)”的方法幫助鞏固適宜的編程實踐。
ActorRef有以下特點:
http://blog.csdn.net/JasonDing1354/article/details/50533113
- 它是不可變的
- 它與actor實體是一對一的關係
- 它是可序列化的,網絡可感知的。這使得你可以在網絡環境中傳送一個ActorRef