阿卡 - 重新监督演员

时间:2013-03-21 13:30:00

标签: java akka akka-supervision

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

受监督的演员有一个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);
        }
    }

现在我想保留失败的演员的内部状态!我理解只有当我的策略是'resume'时才会保留状态,但是在这种情况下,不会调用onRestart挂钩并且消息将丢失。

问题:

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

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

1 个答案:

答案 0 :(得分:1)

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

你的策略应该是在崩溃/重启时重置actor。如果你想保持内部状态,你必须将它传递给其他地方(其他演员,数据库),以便在新演员开始时再次询问它。

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

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