2017-08-17 13 views
1

childという俳優にという1人のメッセージを送信するparent俳優がいるとします。Akka - 子供が例外を抱えた後に親が子にメッセージを送信する方法

子が現在のメッセージの処理を終了すると、子に新しいメッセージを送信することを親に通知します。

子供が特定のメッセージにcrashs場合でも、このループを維持するために、私は親にSupervisorStrategyを追加しました:

private static SupervisorStrategy strategy = 
     new OneForOneStrategy(10, Duration.create("1 minute"), 
       new Function<Throwable, SupervisorStrategy.Directive>() { 
        @Override 
        public SupervisorStrategy.Directive apply(Throwable t) { 
         if (t instanceof NullPointerException) { 
          return resume(); 
         } else { 
          return escalate(); 
         } 
        } 
       }); 

アイデアは、子供にheppens何に関係なく、それが再開されるということです親は次のメッセージを送信することができます。

しかし、次のメッセージを送信するために、エラーが発生したときに親はどのように知っていますか?

子供に何か起こったという親に対するトリガーとは何ですか?

"onChileError"メソッドのようにオーバーライドする必要がありますか?

(スカラのJavaの例を上回ります)

ありがとうございました。

答えて

0

私は次のシナリオ(サンプルはScalaである)を実装することをお勧め:創造に子供の死の時計に購読

// Stop actors on error - DeathWatch will handle restart sequence 
override def supervisorStrategy: SupervisorStrategy = SupervisorStrategy.stoppingStrategy 

エラーで停止する

設定スーパーバイザ戦略を

def createWorker() = { 
    val worker = actorOf(...) 
    context.watch(worker) 
    worker 
} 

子が突然終了した場合は、新しい子を作成して、現在の作業の部分を再送信してください(または、必要に応じて次の作業を再送信してください)

case Terminated(actor) => 
    val worker = createWorker() 
    worker ! DoWork(...) 

これは、クラスタ内でノードが到達不能になったときに監督戦略を引き起こさず、リモート死亡監視のみを開始するため、クラスタのアクタを開始すると役立ちます。子供はそれが子供に新しいメッセージを送信する順番に親に通知し、現在のメッセージを処理して行われ

1

....

考え方は、子供にheppens何に関係なくそれが再開され、親は次のメッセージを送信することができます。

あなたの現在のスーパーバイザ戦略は、以下のん:NullPointerExceptionは何事もなかったかのように子供が再開され、子にスローされた場合。別の例外がスローされた場合、それはアクター階層のさらに上にエスカレートされます。これは、default supervisor strategyがキックインする可能性があります。この場合、子が再起動されます。あなたは子供が、関係なく、例外の再開以下にあなたの戦略を変更したい場合(私はDeciderBuilderを使用しています):

private static SupervisorStrategy strategy = 
    new OneForOneStrategy(10, Duration.create(1, TimeUnit.MINUTES), DeciderBuilder. 
    match(Exception.class, e -> { 
     // getSelf() is the parent and getSender() is the child 
     GiveMeAnotherMessage message = // ... 
     getSelf().tell(message, getSender()); 
     resume(); 
    }) 
    .matchAny(o -> escalate()) 
    .build()); 

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

しかし、どのようにエラーが送信するために、発生したときに親が知っています次のメッセージ?

子供に何か起こったという親に対するトリガーとは何ですか?

"onChileError"メソッドのようにオーバーライドする必要がありますか?

決定者はgetSender()を経由して、現在失敗した子の参照にアクセスすることができますので、あなたがしなければならないすべては、それは子供が内から別のメッセージを処理する準備ができていることを知っているように親にメッセージを送っています戦略そのもの、上記のコードが示すように。

関連する問題