0

我目前有使用 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());

当执行此代码块并且电路打开时,它无法快速抛出异常,但是我想将控制权返回给处理未来的代码,而无需等待超时。

这可能吗?

4

1 回答 1

3

当参与者失败并重新启动时,如果它正在处理消息,则不会自动向该发送者发送响应。如果您想在特定失败时向该发件人发送消息,则显式捕获该异常并以失败结果回复该发件人,确保在进入任何未来回调之前先捕获发件人以避免关闭此可变状态. 您也可以尝试在 preRestart 中执行此操作,但这不是很安全,因为到那时,如果您在 actor 内部使用期货,发送者可能已经改变。

于 2014-08-21T12:53:04.250 回答