我在我的项目中使用 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)。这是正确的理解吗?