我目前正在研究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/supervision.html#supervision
以下是一些问题:
1) 当我们知道要期望哪些异常时,是否应该在Actor中使用try/catch块?为什么或者为什么不?如果不使用,是否应该依赖于监督策略来有效地处理子Actor可能抛出的异常?
2) 默认情况下,如果父Actor中没有明确配置监督器,则似乎任何抛出异常的子Actor都将默认重启。 那么如果您的整个系统中没有任何Actor携带状态,我们是否真的应该执行重启操作?
3) 如果由system.actorOf(...)创建的顶级Actor抛出异常,该怎么办?如何在Actor系统外提供监督策略?
4) 假设有一个Actor A,它有一个子Actor B。现在假设Actor A要求Actor 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的preStart中,他调用getContext()。actorOf(B),并且在B的preStart中,他调用getContext()。actorOf(C)。如果A出现异常,那么系统中是否会存在多个actor B和多个actor C?
谢谢!