Akka逐步升级的监管策略阻止了孩子

时间:2018-10-07 16:01:44

标签: akka

我正在尝试OneForOneStrategy策略,该策略升级失败。我的Actor结构是:Supervisor -> Slave,其中Slave是Supervisor的子代。

从站响应2条消息-“ 失败”(引发异常)和“ 工作”(进行一些记录)

我的第一个问题是,如果Slave失败,则Supervisor将重新启动(由于升级策略,“ Guardian”已将其重新启动),但是Slave已停止且未重新启动。

我猜想这种默认行为是有原因的,即停止子进程而不是重新启动子进程。您能解释一下这个设计决定吗?在什么情况下,这比重新启动更好的方法吗?

我的行为问题是从站的收件箱看起来像这样:“ 工作”,“ 失败”,“ 工作”。< / p>

失败后,由于从站已停止并启动(通过Supervisor的初始化),最后一个“工作”消息以Dead Letter结尾。 解决方案是覆盖preRestart方法:

@Override
public void preRestart(Throwable reason, Optional<Object> message) throws Exception {
    postStop();
}

这解决了问题,并导致子级重新启动。我还必须在Supervisor中更改Slave的初始化。

1 个答案:

答案 0 :(得分:0)

孩子们停下来的原因是,他们被视为演员内部状态的一部分,而当演员重新启动时,可以说是从干净的状态开始。

您已经注意到,可以通过覆盖preRestart来退出。

我们正在重新考虑Akka Typed(这是下一代Akka actor API)的默认行为,如果您好奇的话,可以在这里看到一些讨论:https://github.com/akka/akka/issues/25556