0

現在、Ask パターンを使用してリクエストをディスパッチするコードがあります。ディスパッチされたリクエストは、HTTP リクエストを送信してレスポンスを返す Akka アクターを生成します。Akka のサーキット ブレーカー API を使用して、呼び出す上流の Web サービスの問題を管理しています。

サーキット ブレーカーが開いた状態の場合、後続のすべての要求はすぐに失敗します。これは望ましい結果です。ただし、アクターがすぐに失敗すると、CircuitBreakerOpenException がスローされ、アクターが停止しますが、AskTimeoutException が生成されるまで、最初の要求を行ったコードに制御が戻りません。

これは、リクエストをディスパッチするコードです

Timeout timeout = new Timeout(Duration.create(10, SECONDS));
Future<Object> future = Patterns.ask(myActor, argMessage, timeout);
Response res = (Response ) Await.result(future, timeout.duration());

これがサーキットブレーカー

getSender().tell(breaker.callWithSyncCircuitBreaker(new Callable<Obj>() 
                    {
                        @Override
                        public Obj call() throws Exception {
                            return fetch(message);
                        }
                    }), getSelf()
            );
getContext().stop(getSelf());

このコードブロックが実行され、回路が開いている場合、例外をすばやくスローして失敗しますが、タイムアウトを待たずに未来を処理するコードに制御を戻したいです。

これは可能ですか?

4

1 に答える 1