現在、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());
このコードブロックが実行され、回路が開いている場合、例外をすばやくスローして失敗しますが、タイムアウトを待たずに未来を処理するコードに制御を戻したいです。
これは可能ですか?