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

Official Actor Status machine

Akka Actor 的生命週期,正如同一個狀態機一樣,經由幾個Trigger(method invoke)去進行狀態轉換。

上圖是Akka官方提供的狀態機,不過我從實務的代碼來看運行的狀態改動會更貼切一點:

Actor 在運行時,Akka framework在對於Actor被初始化時會引發兩個CallBack

preStart()

postStop()

由於Akka 已經有提供了基類(base abstract class)的template pattern 提供基礎的運行代碼,所以我Override 這兩個method:

Override preStart() , postStop() callBack methods

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

這樣的基礎限制條件,其實跟很多知名的容器體系下的元件使用模式理念相同,譬如我們不能直接去New EJB Instance,不能直接去New一個已經有對Spring framework 重度相依的 Bean instance一樣。


Try new instance by new syntax but would be error.

上例當中直接new ,執行結果如下:

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 ‘actorOf’ factory methods to create a new actor. See the documentation.

這是因為Akka framework 是以factory pattern(by actorOf method)來統一實現Actor 初始化的做法,正確的作法應該是利用Akka system context去創建你需要的Actor instance。

Akka create actor with akka system context

執行啟動後,可以看到一個類似於Web URI 的位址連結


Callback invoked

[akka://sample/user/test]

Akka 對於Actor 的管理模式,是採行一個樹狀的地址模型,每一個actor 都能創建出他的子Actor 或相關連操作的 Actor,每一個上層的Actor都有責任與義務去照顧與監控他底下的子Actor或相依的Actor,這樣的樹狀體系體現在URI上,就還蠻容易理解了。

從上述的log當中確實看到,Actor 物件在初始化之後,會自動地進行preStart()/postStop(),為了能更精確理解建構的流程,我刻意添加了default constructor 來看看他跑的流程:

run with constructor

如果在對Actor 的操作,有一些很特定的業務場景需要綁定相依的物件資源時(譬如建構子直接注入 external repository, 或者注入 external service gateway access point),可以在這幾個method 當中特別去留意狀態變化,有時候問題有機會在這幾個時機點去幫忙做除錯的檢驗。

接著看看如何停止Actor : 

Akka 在Java 方面的實現是透過 Actor receive command時, 基於 actorContext 停止Actor


Stop Actor via actorContext

寫個測試代碼運行看看

demo stop Actor in Junit

運行結果

testing result

可以看到Actor實體確實正確的被停止了,但是因為我試圖要做驗證檢查Actor status,Akka framewok抗議了,因為我試圖要從ActorSystem 當中去獲取還在運行狀態的Actor,但是因為已經中斷了(不存在這樣的一個running actor),所以會拋出illegalActorStateException。

特別一提,Akka 在Java 的實現上,僅提供了透過receive command ,藉由actorContext 執行stop actor 的做法,但是在Scala上,則可以直接在外部操作Stop 的這個trait method直接停掉Actor,這是蠻大的差異的。


Actor lifecycle trait method define

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

前面測試理解到假設Actor Instance已經是進入到terminated的狀態,若我們試圖再一次對他送信息,看看系統會有啥反應?

reSendMessageToAnTerminatedActor

ActorSystem偵測到這個actor的狀態已經是不可觸及的,於是把信息塞入到DeadLetter 裡頭去 !


DeadLetter environment

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • The Art of Jumping Time Lines跳躍時間線的藝術 A Hathor Planetary ...
    愉悦的Gil阅读 881评论 0 4
  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,138评论 3 49
  • 海归>清华北大毕业生>958/211重点大学>普通本科院校>专科院校 前段时间热议的考研老师张雪峰的演讲,刺痛了很...
    有趣的方又方阅读 499评论 2 2
  • 1. 我梦中遇见你 你叫等等 爱涂绿色的面膜 喜欢和我一起吃火锅 我上班迟到了 因为梦境中的路和现实中的不一样 梦...
    小红帽Jane阅读 647评论 0 3
  • 我把忧伤写在眼里 眺望远方 如果听见 记得帮我传给那位芳香 莫等忧伤化为沧桑 只能淡淡地想 远方 千里伊人可知我心...
    了草阅读 155评论 0 0