【发布时间】:2019-03-12 10:04:25
【问题描述】:
我正在试验OneForOneStrategy 策略,它升级失败。我的 Actor 结构是:Supervisor -> Slave,其中 Slave 是 Supervisor 的子节点。
Slave 响应 2 条消息 - “fail”(抛出异常)和“work”(进行一些日志记录)
我的第一个问题是,如果 Slave 失败,那么 Supervisor 会重新启动(由于升级策略,“Guardian”已经重新启动它),但是 Slave 被停止并没有重新启动。
我想这种默认行为是停止子进程而不是重新启动它们是有原因的。你能解释一下这个设计决定吗?在哪些情况下,这是比重启更好的方法?
我的问题是 Slave 的收件箱看起来像这样:“work”、“fail”、“work”。
失败后,最后一个“工作”消息以死信结束,因为从站被停止和启动(通过初始化主管)。
解决方案是覆盖preRestart 方法:
@Override
public void preRestart(Throwable reason, Optional<Object> message) throws Exception {
postStop();
}
这解决了问题并导致子项重新启动。我还必须在 Supervisor 中更改 Slave 的初始化。
【问题讨论】:
标签: akka