アッカJavaはこちら。フューチャーを使用した「アスク」パターンに関する Akka ドキュメントを読んだところですが、スーパーバイザー戦略 (ディサイダー) と失敗コールバックの両方が図の一部であるシナリオに関して、いくつかのことがどのように機能するかを理解していません。
子供に尋ねる親
2 つのアクターがいてFizz
、Buzz
がFizz
の親/作成者であるとしBuzz
ます。の親であるため、失敗を処理するFizz
forがあります。Buzz
SupervisorStrategy
Buzz
// 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 つの結果のいずれかになります。
Buzz
正常に戻り、 ;を提供GetBuzzDataCallback
します。bData
またBuzz
をスローしBuzzIsAngryException
ます。またBuzz
他の種類の例外/エラーをスローします
後者の2つのケースで何が起こるのか疑問に思っています:
- 例外は誰に、どのような順序で、どのように通知されますか? つまり、引数
GetBuzzDataCallback
として例外が送信されますか?Throwable failure
または、FizzFailureDecider
呼び出されますか?または両方 (コールバックとディサイダー/スーパーバイザー戦略の両方にエラーが渡されると、少し冗長で複雑に見えます)?
子以外に尋ねる親
がの親/作成者でFizz
はないことを除いて、上記と同じシナリオですBuzz
。この場合、 (その引数GetBuzzDataCallback
として) に例外が送信されたと想定できますか?Throwable failure
私の質問の根底にあるのはこれだと思います: スーパーバイザー戦略と将来のコールバックが関係する場合、子例外がスローされたときに誰に通知され、どのような順序で通知されますか? 上で述べたように、両方が失敗/例外を受け取った場合Buzz
、コールバックが例外で何か他のことをしようとしている間にスーパーバイザー戦略が再起動しようとしている可能性があるため、私にとってはさらに混乱します (競合する可能性があります)。
注意: 必須ではありませんが、提供されるコード スニペットが Scala ではなくJava である場合は、非常にありがたいです(Scala は私には象形文字のように見えます)。