0

アッカJavaはこちら。フューチャーを使用した「アスク」パターンに関する Akka ドキュメントを読んだところですが、スーパーバイザー戦略 (ディサイダー) と失敗コールバックの両方が図の一部であるシナリオに関して、いくつかのことがどのように機能するかを理解していません。

子供に尋ねる親

2 つのアクターがいてFizzBuzzFizzの親/作成者であるとしBuzzます。の親であるため、失敗を処理するFizzforがあります。BuzzSupervisorStrategyBuzz

// Groovy pseudo-code
class Fizz extends UntypedActor {
    ActorRef buzz

    // Contstructor omitted for brevity, but Buzz is the child of
    // Fizz.

    @Override
    void onReceive(Object message) {
        if(message instanceof FizzRequest) {
            FizzRequest fReq = message as FizzRequest

            // Exceptions thrown here (inside of Buzz) will be
            // handled by Fizz’s supervisor strategy.
            Future<BuzzData> bDataFut = Patterns.ask(buzz,
                fReq.buzzRequest, 500)
            bDataFut.onComplete(new GetBuzzDataCallback())

            // etc.
        } else {
            unhandled(message)
        }
    }

    @Override
    SupervisorStrategy supervisorStrategy() {
        new FizzSupervisorStrategy()
    }
}

class Buzz extends UntypedActor {
    // …etc.
}

class FizzDecider extends Function<Throwable,Directive> {
    @Override
    Directive apply(Throwable throwable) {
        if(throwable instanceof BuzzIsAngryException) {
            return SupervisorStrategy.restart()
        }

        SupervisorStrategy.stop()
    }
}

class FizzSupervisorStrategy extends OneForOneStrategy {
    FizzSupervisorStrategy() {
        super(true, new FizzDecider())
    }
}

class GetBuzzDataCallback extends OnComplete<BuzzData> {
    @Override
    void onComplete(Throwable failure, BuzzData bData) {
        if(failure != null) {
            // If Buzz is the child of Fizz, does this code execute, or
            // just the FizzDecider above? Or both? I’m so confused!
        } else {
            // Handle success. Likely use an ‘Inbox’ to send
            // ‘bData’ back to Fizz.
        }
    }
}

場合によっては、いくつかのデータFizzを要求する必要がありBuzzます。これが発生すると、次の 3 つの結果のいずれかになります。

  1. Buzz正常に戻り、 ;を提供GetBuzzDataCallbackします。bDataまた
  2. BuzzをスローしBuzzIsAngryExceptionます。また
  3. Buzz他の種類の例外/エラーをスローします

後者の2つのケースで何が起こるのか疑問に思っています:

  • 例外は誰に、どのような順序で、どのように通知されますか? つまり、引数GetBuzzDataCallbackとして例外が送信されますか? Throwable failureまたは、FizzFailureDecider呼び出されますか?または両方 (コールバックとディサイダー/スーパーバイザー戦略の両方にエラーが渡されると、少し冗長で複雑に見えます)?

子以外に尋ねる親

がの親/作成者でFizzないことを除いて、上記と同じシナリオですBuzz。この場合、 (その引数GetBuzzDataCallbackとして) に例外が送信されたと想定できますか?Throwable failure

私の質問の根底にあるのはこれだと思います: スーパーバイザー戦略将来のコールバックが関係する場合、子例外がスローされたときに誰に通知され、どのような順序で通知されますか? 上で述べたように、両方が失敗/例外を受け取った場合Buzz、コールバックが例外で何か他のことをしようとしている間にスーパーバイザー戦略が再起動しようとしている可能性があるため、私にとってはさらに混乱します (競合する可能性があります)。

注意: 必須ではありませんが、提供されるコード スニペットが Scala ではなくJava である場合は、非常にありがたいです(Scala は私には象形文字のように見えます)。

4

1 に答える 1