gpt4 book ai didi

java - Akka 和 Ask 模式。当 Actor 突然停止时我可以返回 Future 吗?

转载 作者:行者123 更新时间:2023-12-01 22:45:33 24 4
gpt4 key购买 nike

我目前有使用 Ask 模式分派(dispatch)请求的代码。分派(dispatch)的请求将生成一个 Akka Actor,它发送 HTTP 请求,然后返回响应。我正在使用 Akka 的断路器 API 来管理我调用的上游 Web 服务的问题。

如果断路器处于打开状态,则所有后续请求都会快速失败,这是预期的效果。然而,当actor快速失败时,它只会抛出CircuitBreakerOpenException,停止actor,但控制不会返回到发出初始请求的代码,直到生成AskTimeoutException。

这是分派(dispatch)请求的代码

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());

当执行这段代码时,如果电路打开,它会快速失败并抛出异常,但是我想将控制权返回给处理 future 的代码,而不必等待超时。

这可能吗?

最佳答案

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

关于java - Akka 和 Ask 模式。当 Actor 突然停止时我可以返回 Future 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25424650/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com