1

私のプロジェクトでは、再試行スキームを提供するために 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.状態が連続した順序を維持している場合は、「順序付けられた」メールボックスの実装 (デキュー ベース) を提供する必要があります。それは正しい理解ですか?

4

1 に答える 1

1

preRestart フェーズにある Actor にメッセージを送信できるかどうかは疑問です。

あなたの戦略は、アクターがクラッシュ/再起動時にリセットされることです。内部状態を保持したい場合は、それを別の場所 (他のアクター、データベース) に渡して、新しいアクターが開始されたときにもう一度尋ねる必要があります。

スーパーバイザにもう少しロジックを実装してみませんか?

使用している Akka のバージョンが正確にわかっている場合は、ここにサンプル コードを投稿します。

于 2013-05-06T16:25:01.760 に答える