0

私が構築している新しい akka アプリケーションに関して、設計上の課題があります。問題/課題は次のとおりです。クライアント側で、リクエストを送信する単純なアクターを作成し、bebe() を使用して適切なサーバーの応答を待ちます。もちろん、タイムアウト メッセージも含めます。適切な時間内に回答が得られない。ただし、興味深いのはサーバー側です。ここに私は次の構造を持っています:

アクター A (ラウンド ロビン ルーターとして構成) このルーターは、クライアントからすべての要求を受信して​​います。

次に、アクター A はメッセージをアクター A1、A2...Ax に転送します。これらはすべてアクター A のコンテキストで作成されたものであり、アクター A がスーパーバイザーであることを意味します。

通常の場合、メッセージは転送されるため、Actor Axe は送信者に返信するだけで済みますが、エラーが発生した場合は、サーバー ログにログを記録するだけでなく、ユーザーに通知することもできます。発生したエラーに関する情報の種類。

完璧な世界では、スーパーバイザー戦略で getErrorActorsLastSender() のようなことを言ってから、問題の原因となったクライアントの ActorRef を取得できるようにしたいと考えています。私がこれを好む理由は、すべてのエラー処理を 1 か所で行うことができ、すべての予期しない例外が少なくとも何らかの一般的な方法で常に処理されるからです。

別の方法は、各子アクターで prerestart() メソッドをオーバーライドし、例外がスローされたときにアクターを再起動するスーパーバイザー戦略を作成することです。ただし、これには x 子アクターに対してこのメ​​ソッドを実装する必要があります。

これがスーパーバイザーの戦略から可能である場合、何か良い提案はありますか?

前もって感謝します。

4

2 に答える 2

1

OneForOneStrategyを拡張するなどして、独自のスーパーバイザー戦略を作成してみましたか? handleFailure(とりわけ) 子と失敗の原因を取るというメソッドがあります。また、エラーの原因となったメッセージの送信者を示す ActorContext を取得します。このメソッドをオーバーライドすると、必要なことを実行できるはずです。

于 2013-09-02T06:18:17.413 に答える