私のプロジェクトでは、再試行スキームを提供するために Akka (Java) を使用しています。そのため、メッセージを受信すると監視対象のアクターに委任するスーパーバイザー アクターがあります。スーパーバイザーを (無条件に) 再起動する 1 対 1 の戦略があります。
監視対象のアクターには、メッセージを自分自身に送信する 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.状態が連続した順序を維持している場合は、「順序付けられた」メールボックスの実装 (デキュー ベース) を提供する必要があります。それは正しい理解ですか?