Java Akka-重新启动受监督的参与者

Java Akka-重新启动受监督的参与者,java,akka,akka-supervision,Java,Akka,Akka Supervision,我在项目中使用Akka(Java)来提供重试方案。因此,我有一个主管演员,它在收到消息时将其委托给一个主管演员。我对主管有一个一对一的重新启动策略(无条件)。 受监督的参与者有一个预重启钩子,它将消息发送给self。 @Override public void preRestart(Throwable reason, Option<Object> message){ //send it to the supervisor so that it can be e

我在项目中使用Akka(Java)来提供重试方案。因此,我有一个主管演员,它在收到消息时将其委托给一个主管演员。我对主管有一个一对一的重新启动策略(无条件)。 受监督的参与者有一个预重启钩子,它将消息发送给self。

@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);
        }
    }
@覆盖
公共无效预重启(可丢弃原因、选项消息){
//将其发送给主管,以便再次排队重试
if(reason.getCause()instanceof SQLException){
error(“不重试,因为SQL本身似乎有问题!”);
super.preRestart(原因、消息);
}
否则{
log.warn(“+state+”正在尝试重做处理:“+((RecordData)message.get()).getRecord());
getSelf().tell(message.get(),getSender());
super.preRestart(原因、消息);
}
}
现在我还想保留失败演员的内部状态!我知道只有当我的策略是“恢复”时,状态才会被保留,但在这种情况下,onRestart钩子将不会被调用,消息将丢失。 问题:1。实现这一点的唯一方法是在消息本身中设置状态并重新启动吗?
二,。如果状态保持顺序,那么我需要提供“有序”邮箱实现(基于出列)。这是正确的理解吗?

我怀疑您是否可以向处于重新启动前阶段的参与者发送消息

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

为什么不在监管者中实现更多的逻辑呢


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

我怀疑您是否可以向处于重新启动前阶段的参与者发送消息

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

为什么不在监管者中实现更多的逻辑呢


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

您应该在可以重新启动的子角色中执行危险的工作,并将宝贵的状态保持在层次结构的较高位置。您应该在可以重新启动的子角色中执行危险的工作,并使宝贵的国家在等级制度中处于更高的地位。