Akka的Hello World(三)Actor失败处理
生活随笔
收集整理的這篇文章主要介紹了
Akka的Hello World(三)Actor失败处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
父母和孩子在整個生命周期中都是相互聯系的。每當一個actor失敗(拋出異常或未處理的異常)時,它會暫時中止。如前所述,失敗信息將傳播到父級,然后父級決定如何處理子actor引起的異常。通過這種方式,父母可以擔任孩子的監督員。默認的策略是停止并重新啟動孩子。如果不更改默認策略,則所有失敗都會導致重新啟動。
讓我們在一個簡單的實驗中觀察默認策略。
(一)創建maven工程,添加依賴
<dependencies><dependency><groupId>com.typesafe.akka</groupId><artifactId>akka-actor_2.12</artifactId><version>2.5.22</version></dependency></dependencies>(二)編寫代碼
import akka.actor.AbstractActor; import akka.actor.AbstractActor.Receive; import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.actor.Props;class SupervisingActor extends AbstractActor {static Props props() {return Props.create(SupervisingActor.class, SupervisingActor::new);}ActorRef child = getContext().actorOf(SupervisedActor.props(), "supervised-actor");@Overridepublic Receive createReceive() {return receiveBuilder().matchEquals("failChild",f -> {child.tell("fail", getSelf());}).build();} }class SupervisedActor extends AbstractActor {static Props props() {return Props.create(SupervisedActor.class, SupervisedActor::new);}@Overridepublic void preStart() {System.out.println("supervised actor started");}@Overridepublic void postStop() {System.out.println("supervised actor stopped");}@Overridepublic Receive createReceive() {return receiveBuilder().matchEquals("fail",f -> {System.out.println("supervised actor fails now");throw new Exception("I failed!");}).build();} } public class ActorHierarchyExperiments {public static void main(String[] args) throws java.io.IOException {ActorSystem system = ActorSystem.create("testSystem");ActorRef supervisingActor = system.actorOf(SupervisingActor.props(), "supervising-actor");supervisingActor.tell("failChild", ActorRef.noSender());} }(三)運行測試?
?
(四)分析
我們看到失敗后,受監督的Actor被停止并立即重新啟動。我們還看到一個日志條目,報告了處理的異常,在本例中是我們的測試異常。在這個例子中,我們使用preStart()和postStop(),它們的默認重新啟動之前和結束之后被調用,所以我們不能從Actor內部區分首次啟動或重啟。這通常正確的做法是,重新啟動的目的是將Actor設置為已知良好狀態,這通常意味著一個干凈的起始階段。實際發生的是,雖然在preRestart()和postRestart()方法被調用,如果不重寫,默認情況下分別委托postStop()和preStart()。您可以嘗試覆蓋這些其他方法,并查看輸出如何更改。?
總結
以上是生活随笔為你收集整理的Akka的Hello World(三)Actor失败处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Akka的Hello World(二)A
- 下一篇: Json格式的netconf转成Norm