Reactive Messaging Patterns with Actor Model?—?3 Akka Actor (二)生命週期管理

Official Actor Status machine

Akka Actor 的生命週期缓窜,正如同一個(gè)狀態(tài)機(jī)一樣,經(jīng)由幾個(gè)Trigger(method invoke)去進(jìn)行狀態(tài)轉(zhuǎn)換谍咆。

上圖是Akka官方提供的狀態(tài)機(jī)禾锤,不過我從實(shí)務(wù)的代碼來看運(yùn)行的狀態(tài)改動(dòng)會(huì)更貼切一點(diǎn):

Actor 在運(yùn)行時(shí),Akka framework在對(duì)於Actor被初始化時(shí)會(huì)引發(fā)兩個(gè)CallBack

preStart()

postStop()

由於Akka 已經(jīng)有提供了基類(base abstract class)的template pattern 提供基礎(chǔ)的運(yùn)行代碼摹察,所以我Override 這兩個(gè)method:

Override preStart() , postStop() callBack methods

在初始化Actor 的時(shí)候恩掷,我們不能很單純的把它當(dāng)成物件直接去new ,原因是Actor 是仰賴於整個(gè)Akka framework 做生命週期管控供嚎,Akka提供了 ActorRef 機(jī)制(你可以想像他是actor instance access interface)黄娘,透過ActorRef 對(duì)instance 做查找與執(zhí)行訊息傳遞的行為 !

這樣的基礎(chǔ)限制條件,其實(shí)跟很多知名的容器體系下的元件使用模式理念相同克滴,譬如我們不能直接去New EJB Instance逼争,不能直接去New一個(gè)已經(jīng)有對(duì)Spring framework 重度相依的 Bean instance一樣。


Try new instance by new syntax but would be error.

上例當(dāng)中直接new 劝赔,執(zhí)行結(jié)果如下:

akka.actor.ActorInitializationException: You cannot create an instance of [solid.humank.actor.ExplainActorLifeCycle] explicitly using the constructor (new). You have to use one of the ‘a(chǎn)ctorOf’ factory methods to create a new actor. See the documentation.

這是因?yàn)锳kka framework 是以factory pattern(by actorOf method)來統(tǒng)一實(shí)現(xiàn)Actor 初始化的做法誓焦,正確的作法應(yīng)該是利用Akka system context去創(chuàng)建你需要的Actor instance。

Akka create actor with akka system context

執(zhí)行啟動(dòng)後着帽,可以看到一個(gè)類似於Web URI 的位址連結(jié)


Callback invoked

[akka://sample/user/test]

Akka 對(duì)於Actor 的管理模式杂伟,是採行一個(gè)樹狀的地址模型移层,每一個(gè)actor 都能創(chuàng)建出他的子Actor 或相關(guān)連操作的 Actor,每一個(gè)上層的Actor都有責(zé)任與義務(wù)去照顧與監(jiān)控他底下的子Actor或相依的Actor赫粥,這樣的樹狀體系體現(xiàn)在URI上观话,就還蠻容易理解了。

從上述的log當(dāng)中確實(shí)看到傅是,Actor 物件在初始化之後匪燕,會(huì)自動(dòng)地進(jìn)行preStart()/postStop()蕾羊,為了能更精確理解建構(gòu)的流程喧笔,我刻意添加了default constructor 來看看他跑的流程:

run with constructor

如果在對(duì)Actor 的操作,有一些很特定的業(yè)務(wù)場景需要綁定相依的物件資源時(shí)(譬如建構(gòu)子直接注入 external repository, 或者注入 external service gateway access point)龟再,可以在這幾個(gè)method 當(dāng)中特別去留意狀態(tài)變化书闸,有時(shí)候問題有機(jī)會(huì)在這幾個(gè)時(shí)機(jī)點(diǎn)去幫忙做除錯(cuò)的檢驗(yàn)。

接著看看如何停止Actor :?

Akka 在Java 方面的實(shí)現(xiàn)是透過 Actor receive command時(shí)利凑, 基於 actorContext 停止Actor


Stop Actor via actorContext

寫個(gè)測(cè)試代碼運(yùn)行看看

demo stop Actor in Junit

運(yùn)行結(jié)果

testing result

可以看到Actor實(shí)體確實(shí)正確的被停止了浆劲,但是因?yàn)槲以噲D要做驗(yàn)證檢查Actor status,Akka framewok抗議了哀澈,因?yàn)槲以噲D要從ActorSystem 當(dāng)中去獲取還在運(yùn)行狀態(tài)的Actor牌借,但是因?yàn)橐呀?jīng)中斷了(不存在這樣的一個(gè)running actor),所以會(huì)拋出illegalActorStateException割按。

特別一提膨报,Akka 在Java 的實(shí)現(xiàn)上,僅提供了透過receive command 适荣,藉由actorContext 執(zhí)行stop actor 的做法现柠,但是在Scala上,則可以直接在外部操作Stop 的這個(gè)trait method直接停掉Actor弛矛,這是蠻大的差異的够吩。


Actor lifecycle trait method define

上圖中,很明確地看到了Akka 的設(shè)計(jì)原則是只能夠透過內(nèi)部context來操作生命週期轉(zhuǎn)換丈氓,不過希望只是我還沒找到在Java上的外部停止Actor的做法周循,不然只能基於Command 的操作還真是有些不方便。

前面測(cè)試?yán)斫獾郊僭O(shè)Actor Instance已經(jīng)是進(jìn)入到terminated的狀態(tài)万俗,若我們?cè)噲D再一次對(duì)他送信息湾笛,看看系統(tǒng)會(huì)有啥反應(yīng)?

reSendMessageToAnTerminatedActor

ActorSystem偵測(cè)到這個(gè)actor的狀態(tài)已經(jīng)是不可觸及的,於是把信息塞入到DeadLetter 裡頭去 !


DeadLetter environment

接續(xù)该编,就是該思考怎麼把Dead Letter 給拿出來做後續(xù)處理了~待續(xù)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末迄本,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子课竣,更是在濱河造成了極大的恐慌嘉赎,老刑警劉巖置媳,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異公条,居然都是意外死亡拇囊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門靶橱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寥袭,“玉大人,你說我怎么就攤上這事关霸〈疲” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵队寇,是天一觀的道長膘掰。 經(jīng)常有香客問我,道長佳遣,這世上最難降的妖魔是什么识埋? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮零渐,結(jié)果婚禮上窒舟,老公的妹妹穿的比我還像新娘。我一直安慰自己诵盼,他們只是感情好惠豺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著拦耐,像睡著了一般赡矢。 火紅的嫁衣襯著肌膚如雪拗慨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音晤锹,去河邊找鬼凤薛。 笑死收厨,一個(gè)胖子當(dāng)著我的面吹牛缴啡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骂际,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼疗琉,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了歉铝?” 一聲冷哼從身側(cè)響起盈简,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后柠贤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體香浩,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年臼勉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了邻吭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宴霸,死狀恐怖囱晴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瓢谢,我是刑警寧澤畸写,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站恩闻,受9級(jí)特大地震影響艺糜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幢尚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翅楼。 院中可真熱鬧尉剩,春花似錦、人聲如沸毅臊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽管嬉。三九已至皂林,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間蚯撩,已是汗流浹背础倍。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎挎,地道東北人沟启。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像犹菇,于是被迫代替她去往敵國和親德迹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • The Art of Jumping Time Lines跳躍時(shí)間線的藝術(shù) A Hathor Planetary ...
    愉悅的Gil閱讀 896評(píng)論 0 4
  • 為何叫做 shell 揭芍? shell prompt(PS1) 與 Carriage Return(CR) 的關(guān)系胳搞?...
    Zero___閱讀 3,142評(píng)論 3 49
  • 海歸>清華北大畢業(yè)生>958/211重點(diǎn)大學(xué)>普通本科院校>專科院校 前段時(shí)間熱議的考研老師張雪峰的演講芽腾,刺痛了很...
    有趣的方又方閱讀 500評(píng)論 2 2
  • 1. 我夢(mèng)中遇見你 你叫等等 愛涂綠色的面膜 喜歡和我一起吃火鍋 我上班遲到了 因?yàn)閴?mèng)境中的路和現(xiàn)實(shí)中的不一樣 夢(mèng)...
    小紅帽Jane閱讀 662評(píng)論 0 3
  • 我把憂傷寫在眼里 眺望遠(yuǎn)方 如果聽見 記得幫我傳給那位芳香 莫等憂傷化為滄桑 只能淡淡地想 遠(yuǎn)方 千里伊人可知我心...
    了草閱讀 159評(píng)論 0 0