Akka Java在这里。我刚刚阅读了有关使用 futures 的“询问”模式的 Akka 文档,并且不了解一些事情是如何工作的,关于主管策略(决策者)和失败回调都是图片的一部分的场景。
家长问孩子
假设我有两个演员,Fizz
并且的父/创建者Buzz
在哪里。因为is的父级,它有一个for来处理它的失败:Fizz
Buzz
Fizz
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
一些数据。发生这种情况时,可能会出现以下三种结果之一:
Buzz
成功返回并提供GetBuzzDataCallback
withbData
;或者Buzz
抛出一个BuzzIsAngryException
;或者Buzz
引发其他类型的异常/错误
我想知道后两种情况会发生什么:
- 谁会收到异常通知,以什么顺序以及如何通知?换句话说,
GetBuzzDataCallback
发送的异常是否作为其Throwable failure
参数?或者,被FizzFailureDecider
调用?或者两者都有(如果回调和决策者/主管策略都通过了错误,这似乎有点多余和复杂)?
父母询问非儿童
与上面相同的场景,除了nowFizz
不是. 在这种情况下,我可以假设发送异常(作为它的参数)吗?Buzz
GetBuzzDataCallback
Throwable failure
我想我的问题的根源是:当涉及主管策略和未来回调时,当抛出子异常时谁会收到通知,以及以什么顺序?正如我上面提到的,对我来说,如果两者都收到失败/异常,那将更加令人困惑,因为那时您可能有一个主管策略试图重新启动,Buzz
而回调正试图对异常执行其他操作(可能是冲突的)。
请注意:虽然肯定不是必需的,但如果提供的任何代码片段是 Java 而不是Scala(Scala 对我来说就像象形文字),我将不胜感激!