从Akka的主管更新SuperVisor策略是安全/不良做法吗?

时间:2014-05-17 16:02:55

标签: java scala akka

在下面的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,那么这是不可用的?

1 个答案:

答案 0 :(得分:2)

是的,您展示的实施部分确实是安全的。在处理消息的过程中(即子actor的失败),就像onReceive一样调用supervisor策略,因此你可以从其实现中访问actor的状态,包括读写。

更新(回答问题更新):

只有在actor创建子actor后才能调用supervisor策略。由于actor在收到所需的numRetries消息之前可以自由创建子actor,因此它可以确保在第一次失败之前正确设置所有子actor。

应该注意的是,每当孩子发出故障信号时,就会使用supervisorStrategy方法,这意味着将策略缓存在实例变量中通常是有益的。在收到新的numRetries值后,该策略可以替换为从那时开始生效的新策略。