我目前有使用 Ask Pattern 调度请求的代码。分派的请求将生成一个 Akka Actor,它发送一个 HTTP 请求,然后返回响应。我正在使用 Akka 的断路器 API 来管理我调用的上游 Web 服务的问题。
如果断路器处于打开状态,则所有后续请求都会快速失败,这是预期的效果。然而,当actor快速失败时,它只是抛出一个CircuitBreakerOpenException,停止actor,但是控制不会返回到发出初始请求的代码,直到生成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());
当执行此代码块并且电路打开时,它无法快速抛出异常,但是我想将控制权返回给处理未来的代码,而无需等待超时。
这可能吗?