【问题标题】:Akka - restart of supervised actorsAkka - 重新启动受监督的演员
【发布时间】:2013-03-21 13:29:59
【问题描述】:

我在我的项目中使用 Akka (Java) 来提供重试方案。所以我有一个主管演员,它在收到消息时将其委托给受监督的演员。我对主管有一个一对一的策略来重启(无条件地)。

受监督的 Actor 有一个 preRestart 钩子,它将消息发送给自己。

@Override
    public void preRestart(Throwable reason, Option<Object> message){
        //send it to the supervisor so that it can be enqueued once again to retry
        if(reason.getCause() instanceof SQLException){
              log.error("Not retrying since there seems to be a problem with the SQL itself!");
              super.preRestart(reason, message);

        }
        else{
            log.warn(""+state+" Trying to redo a processing: "+((RecordData)message.get()).getRecord());

            getSelf().tell(message.get(), getSender());
            super.preRestart(reason, message);
        }
    }

现在我也想保留失败演员的内部状态!我知道只有当我的策略是“恢复”时才会保留状态,但在这种情况下不会调用 onRestart 钩子并且消息会丢失。

问题:

1。实现这一点的唯一方法是在消息本身中设置状态并重新启动吗?

2。如果状态保持顺序,那么我需要提供一个“有序”邮箱实现(基于出队)。这样理解正确吗?

【问题讨论】:

  • 你应该在一个可以重新启动的子actor中做危险的工作,并在层次结构中保持宝贵的状态。

标签: java akka akka-supervision


【解决方案1】:

我怀疑你是否可以向处于 preRestart 阶段的 Actor 发送消息。

您的策略应该是在崩溃/重启时重置参与者。如果要保留内部状态,则必须将其传递给其他地方(其他参与者、数据库),以便在新参与者启动时再次询问。

为什么不在主管中实现更多的逻辑呢?

如果我知道你使用的是什么版本的 Akka,我会在这里发布一些示例代码。

【讨论】:

    猜你喜欢
    • 2017-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 2015-10-16
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    相关资源
    最近更新 更多