2016-07-14 6 views
0

私はAkkaのドキュメントを読んでいますが、今度はUntypedActorsというセクションにあります。私はいくつかの例を試してみることにしました。ここではAkkaでスーパーバイザ戦略を理解する

は私の俳優は、次のとおりです。

private static class MyUntypedActor extends UntypedActor{ 

    public void onReceive(Object message) throws Exception { 
     System.out.println("Recieved: " + message); 
    } 

    @Override 
    public void preStart(){ 
     getContext().actorOf(AnotherUntypedActor.props()).tell("Process it", getSelf()); 
    } 

    public static Props props(){ 
     return Props.create(MyUntypedActor.class); 
    } 
} 

子供

private static class AnotherUntypedActor extends UntypedActor{ 

    public static Props props(){ 
     return Props.create(AnotherUntypedActor.class); 
    } 

    public void onReceive(Object message) throws Exception { 
     System.out.println("My: " + message); 
     throw new RuntimeException("Crashed: " + getSelf()); 
    } 
} 

メイン:そう

public static void main(String[] args) throws TimeoutException { 
    ActorSystem system = ActorSystem.create(); 
    Inbox inbox = Inbox.create(system); 
    ActorRef actorRef = system.actorOf(MyUntypedActor.props()); 
    inbox.send(actorRef, "Message"); 
} 

、私の子役経験不足と私はth何とか親に通知しておかなければならないはずです。監督が実際に何をするん

Recieved: Message 
My: Process it 
[ERROR] [07/14/2016 19:05:13.726] [default-akka.actor.default-dispatcher-4] [akka://default/user/$a/$a] Crashed: Actor[akka://default/user/$a/$a#-950392568] 

しかし、私が受け取ったが、このでしたか?俳優のせいで何が起こったのですか?ログにエラーメッセージが表示されます。 supervisorStrategyの意味は何ですか?これは、スーパーバイザ戦略を使用することにより

OneForOneStrategy(-1,Duration.Inf,true) 

答えて

1

に設定され、デフォルトでは、あなたはそれが失敗した場合、教師の俳優を使って何をすべきかを決めるのです。親アクターの中でsupervisionStrategy()メソッドをオーバーライドし、戦略を定義する必要があります。私。 SomeExceptionが発生した場合この場合、

@Override 
    public SupervisorStrategy supervisorStrategy() { 
     return strategy; 
    } 

    private static SupervisorStrategy strategy = 
      new OneForOneStrategy(10, Duration.create("1 minute"), 
        t -> { 
         if (t instanceof SomeException) { 
          return restart(); 
         } else { 
          return stop(); 
         } 
        }); 

(IはアッカのためのScalaを使用するので、それが正しいかどうかわからない)、俳優が再起動されます。それ以外の場合は停止します。 4つの戦略のいずれかを選択できます。 Read documentation

ヒント:特定の例外を作成してください!

+0

したがって、戦略の主な目的は、例外がスローされた場合の対処方法を定義することです。実際の決定は決定関数内で行われます。デフォルトでは何もしません(私が知る限り)、そうですか? – user3663882

+0

かなり。そして、私が覚えている限り、デフォルトは 'Restart'です。 –