1

我在我的项目中使用 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.如果状态保持顺序,那么我需要提供一个“有序”的邮箱实现(基于dequeue)。这是正确的理解吗?

4

1 回答 1

1

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

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

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

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

于 2013-05-06T16:25:01.760 回答