我目前正在研究 Akka(Java 版本)中的容错和主管策略。
在 ... http://doc.akka.io/docs/akka/2.3.2/java/fault-tolerance.html和http://doc.akka.io/docs/akka/2.3.2/general/监督.html#supervision
几个问题:
1) 当我们知道会出现什么样的异常时,我们是否应该在我们的演员中使用 try/catch 块?为什么或者为什么不?如果不是,我们是否应该依靠主管策略来有效处理孩子可能抛出的异常?
2)默认情况下,如果没有在父actor中显式配置supervisor,看起来任何抛出异常的子actor都会默认重启。如果你的整个系统中没有一个actors携带状态……我们真的应该重新启动吗?
3) 如果由 system.actorOf( ... ) 创建的顶级演员抛出异常怎么办?你如何在演员系统之外提供监督者策略?
4) 假设演员 A 有一个子演员 B。现在假设演员 A 要求演员 B 做一些工作。
一些代码可能如下所示:
Future<Object> future = Patterns.ask(child, message, timeout);
future.onComplete(new OnComplete<Object>() {
@Override
public void onComplete(Throwable failure, Object result) throws Throwable {
... handle here
}
现在......如果演员 A 以某种方式抛出异常怎么办。默认情况下,它由其主管重新启动。问题是,onComplete “关闭”是否仍会在未来某个时间执行,还是在重新启动时有效地“清除”?
5)假设我有一个层次结构,例如:A->B->C。让我们还假设我覆盖了 preRestart ,这样我就不会有效地阻止我的孩子。在 A 的预启动时,他调用 getContext().actorOf(B),在 B 的预启动时,他调用 getContext().actorOf(C)。如果 A 抛出异常,系统中是否会存在多个参与者 B 和多个参与者 C?
谢谢!