【发布时间】:2015-08-24 16:50:29
【问题描述】:
Akka Java 在这里。我刚刚阅读了 the “ask” pattern using futures 上的 Akka 文档,我不了解一些事情是如何工作的,关于 主管策略(决策者)和失败回调都是图片一部分的场景。
家长问孩子
假设我有两个演员,Fizz 和Buzz,其中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提供bData;或 -
Buzz抛出BuzzIsAngryException;或 -
Buzz引发其他类型的异常/错误
我想知道后两种情况会发生什么:
- 谁会收到异常通知,以什么顺序以及如何通知?换句话说,
GetBuzzDataCallback是否将异常作为其Throwable failure参数发送?或者,是否调用了FizzFailureDecider?或者两者都有(如果 回调和决策者/主管策略都通过了错误,这似乎有点多余和复杂)?
家长问非孩子
与上述情况相同,除了现在Fizz 不是 Buzz 的父/创建者。在这种情况下,我可以假设GetBuzzDataCallback 发送了异常(作为其Throwable failure 参数)吗?
我想我的问题的根源是:当涉及主管策略和未来回调时,当抛出子异常时通知谁,以及以什么顺序?正如我上面提到的,对我来说,如果两者都收到失败/异常,那将更加令人困惑,因为那时你可能有一个主管策略试图重新启动 Buzz 而回调正试图做其他事情(可能是冲突的)例外.
请注意:虽然肯定不是必需的,但如果提供的任何代码 sn-ps 是 Java 和 不是 Scala(Scala 看起来像象形文字我)!
【问题讨论】:
-
为什么反对票没有解释(我称之为打了就跑)?!?这个问题显示研究,不是骗子,是SSCCE。放开我,你这个恶魔!
-
您的链接指向您提出的另一个问题,而不是 Akka 文档。 (注意我没有给你投反对票)
标签: java exception callback akka akka-supervision