Akka的Actor生命週期《Eight》譯

    Actor在建立時出現,而後在用戶請求時中止。每當一個Actor中止時,它的全部孩子也會被遞歸中止。此行爲極大地簡化了資源清理,並有助於避免資源泄漏,例如由打開的套接字和文件引發的資源泄漏。事實上,處理低級多線程代碼時經常被忽視的困難是各類併發資源的生命週期管理。html

    要中止一個Actor,推薦的模式是在Actor內部調用getContext().stop(getSelf())來自行中止,一般做爲對某些用戶定義的中止消息的響應,或者當Actor完成其做業時。經過調用getContext().stop(actorRef)技術上能夠阻止另外一個Actor,可是以這種方式阻止任意Actor是一種很差的作法:嘗試向它們發送PoisonPill或自定義中止消息。多線程

    Akka Actor API公開了許多能夠在Actor實現中覆蓋的生命週期方法,最經常使用的是preStart()和postStop()。併發

  • preStart():在actor開始以後但在它處理第一條消息以前調用。
  • postStop():在actor中止以前調用。此後不會處理任何消息。

    讓咱們在一個簡單的實驗中使用preStart()和postStop()生命週期方法來觀察中止Actor時的行爲。首先,將如下2個Actor類添加到項目中:ide

    並建立一個像上面這樣的「main」方法來啓動,而後向他們發送一個「中止」消息:post

    您能夠再次使用sbt來啓動此程序。輸出應以下所示:測試

    當咱們首先中止Actor時,它中止了它的子Actor,第二,在中止以前。這種排序是嚴格的,在調用父級的postStop()以前調用子級的全部postStop()。ui

    Akka參考手冊的Actor生命週期( Actor Lifecycle )部分提供了關於全生命週期的詳細信息。spa

異常處理

    父和子在整個生命週期中都是相互聯繫的。每當Actor失敗(拋出一個異常或未處理的異常從接收中冒出來)時,它就會被暫時掛起。如前所述,失敗信息被傳播到父進程,而後由父進程決定如何處理由子Actor引發的異常。在這種狀況下,父充當子的監督者。默認的監督策略是中止並從新啓動子進程。若是不更改默認策略,則全部失敗都會致使從新啓動。線程

    讓咱們在一個簡單的實驗中觀察默認策略。將如下類添加到項目中,就像以前的類同樣:3d

    並運行:

    輸出:

    咱們看到失敗後,受監督的Actor被中止並當即從新啓動。咱們還看到一個日誌條目,報告處理的異常,在本例中是咱們的測試異常。在這個例子中,咱們使用preStart()和postStop(),它們是在重啓以後和以前調用的默認值,所以咱們沒法區分actor內部是第一次啓動仍是從新啓動。這一般是正確的作法,從新啓動的目的是將actor設置爲已知良好狀態,這一般意味着一個乾淨的起始階段。實際發生的是調用了preRestart()和postRestart()方法,若是沒有被覆蓋,默認狀況下分別委託給postStop()和preStart()。您能夠嘗試覆蓋這些其餘方法,並查看輸出如何更改。

    對於感興趣的人,咱們還建議您查看監督參考頁面(supervision reference page )以得到更深刻的詳細信息。

概要

    咱們已經瞭解了Akka如何在層級中管理Actor,父Actor監督孩子Actor並處理異常。咱們看到了如何建立一個很是簡單的Actor和孩子Actor。接下來,咱們將經過建模從設備Actor獲取信息所需的通訊來將這些知識應用於咱們的示例用例。稍後,咱們將討論如何管理團隊中的Actor。

原文:https://doc.akka.io/docs/akka/current/guide/tutorial.html

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

相關文章
相關標籤/搜索