在下面的actor层次结构中,有一个父级主管可以创建一个子级主管。配置SupervisorStrategy中的重试次数 儿童监督员我将父母的价值发送给孩子,并相应地更新监督员策略。
Pseudecode:
public class ParentSupervisor {
parent = myActorSystem.actorOf(Props.create(ChildSupervisor.class);
parent.tell(3);
}
public class ChildSupervisor {
int numRetries;
@Override
public SupervisorStrategy supervisorStrategy() {
//use numRetries in strategy
}
@Override
public void onReceive(Object message) throws Exception {
if (message instanceof Integer) {
this.numRetries = (Integer) message
}
}
}
这是一个安全的实施吗?因为我暴露numRetries
或许我不应该这样做。是否有其他机制可以在运行时更新Supervisor参数?
更新:
阅读http://doc.akka.io/docs/akka/snapshot/java/fault-tolerance.html它指出“策略不能随后改变,因为它是演员系统结构的一个组成部分。”但这是可以接受的,因为每个策略只与该actor实例相关联,因此在创建新actor时策略将会更新。
如果可以在onReceive方法之前调用管理程序策略,那么这意味着“numEntries”(在此问题中引用伪代码示例)可以设置为0而不是3.这意味着如果我使用new OneForOneStrategy(numRetries
那么最大重试次数设置为0.这是不合需要的行为,因为我希望父级管理员在子级管理程序中设置最大重试次数,但如果numRetries可能为0,那么这是不可用的?
答案 0 :(得分:2)
是的,您展示的实施部分确实是安全的。在处理消息的过程中(即子actor的失败),就像onReceive一样调用supervisor策略,因此你可以从其实现中访问actor的状态,包括读写。
更新(回答问题更新):
只有在actor创建子actor后才能调用supervisor策略。由于actor在收到所需的numRetries消息之前可以自由创建子actor,因此它可以确保在第一次失败之前正确设置所有子actor。
应该注意的是,每当孩子发出故障信号时,就会使用supervisorStrategy
方法,这意味着将策略缓存在实例变量中通常是有益的。在收到新的numRetries
值后,该策略可以替换为从那时开始生效的新策略。