0

アッカJavaはこちら。私は 2 つのアクター と を持っていParentますChild。前者は後者の親です。Child特定の例外 (たとえば、 ) をスローする場合UnrulyTeenagerExcepton、私が探している動作は次のとおりです。

  • は、例外がスローされたときParentに処理されていたメッセージへの参照を保存します。Childそれから
  • Childが再起動され、永続化されたメッセージが に「再生」されChildます。しかし
  • この保存 -> 再起動 -> 再生サイクルが 3 回発生し、ChildスローがUnrulyTeenagerException3回発生した場合SupervisorStrategy.escalate()

これまでの私の最善の試み:

// Groovy pseudo-code
class ChildFailureDecider extends Function<Throwable,Directive> {
    int maxRetries = 3
    int numRetries = 0

    @Override
    Directive apply(Throwable childFailure) {
        if(childFailure instanceof UnrulyTeenagerException) {
            numRetries++

            if(numRetries <= maxRetries) {
                // TODO: #1 How to persist the message that caused the ‘childFailure’?

                return SupervisorStrategy.restart()

                // TODO: #2 How to ‘play back’ the persisted message to Child?
            }
        }

        SupervisorStrategy.escalate()
    }
}

しかし、ご覧のとおり、メッセージの永続性と再生に苦労しています。何か案は?Java コード サンプルは非常に高く評価されています。Akka は、Scala の象形文字を学習しなくても十分に頑丈です。

4

1 に答える 1

1

Akka の永続性とは、イベント (メッセージとは異なります) を永続的な方法で (ディスクやデータベースなどに) 永続的に記録することです。これにより、アプリケーション全体が終了した場合 (JVM クラッシュやハードウェア障害など)、再起動時にそのアクターの状態を再構築することができます。あなたの場合、単一のアクターに送信されたメッセージを記憶し、そのアクターが障害のために再起動されたときに再送信したいので、この場合は永続化 API は必要ないと思います。

アクターが例外をスローすると、その例外はスーパーバイザーに提示されますが、それを引き起こしたメッセージは提示されません。これを達成するための組み込みの方法はないと思います。スーパーバイザーは、適切なパラメーターを使用してスーパーバイザー戦略を設定することにより、3 回だけ再起動するというルールを管理できます: http://doc.akka.io/japi/akka/2.4-M3/akka/actor/OneForOneStrategy.html#OneForOneStrategy-int -scala.concurrent.duration.Duration-akka.japi.Function-

メッセージの再生は、送信者が処理する必要があります。メッセージが処理されたときに受信者が送信者に受信確認を送信し、受信確認が受信されない場合は送信者が定期的に再試行するようにすることで、セマンティクスを少なくとも 1 回実装できます。詳細については、この質問を参照してください: Akka Message Delivery Guarantees

コードがなくて申し訳ありませんが、Java ではなく Scala API を使用しています。

于 2015-08-27T08:10:55.937 に答える