gpt4 book ai didi

java - 如何将 Akka java 断路器与 CompletableFutures 一起使用?

转载 作者:行者123 更新时间:2023-12-02 03:15:50 25 4
gpt4 key购买 nike

我正在使用 Play! 2.5(Java)和 Akka。这是我的问题:我正在尝试使用 WSClient 调用外部服务,并希望它位于 Akka 断路器后面。下面显示的代码似乎没有按预期工作。

我希望当外部服务无法访问时断路器会打开,但事实并非如此。我猜测问题在于将返回 completableFuture 的 java 8 lambda 表达式包装在 akaa.dispatch.Future.future 中。

我的代码看起来正确吗?如果有问题我该如何修复?

    @Inject
public ServiceActor(WSClient ws) {

this.ws = ws;

circuitBreaker = new CircuitBreaker(getContext().dispatcher(),
getContext().system().scheduler(),
MAX_FAILURES,
CALL_TIMEOUT,
RESET_TIMEOUT
)
.onOpen(this::onOpen)
.onClose(this::onClose)
.onHalfOpen(this::onHalfOpen);

receive(ReceiveBuilder
.match(String.class, x -> {
circuitBreaker.callWithCircuitBreaker(() -> future(() -> callService(),getContext().dispatcher()));
})
.matchAny(o -> log.info("Unknown message"))
.build()
);
}

private CompletableFuture<JsonNode> callService() {
return ws.url(SOME_URL).get()
.thenApply(WSResponse::asJson)
.toCompletableFuture();
}

如果我只是在 callService 中抛出运行时表达式而不执行以下操作:

   private CompletableFuture<JsonNode> callService() {
throw new RuntimeException()
}

现在,断路器打开。

最佳答案

我想出了如何让它发挥作用。使用 callWithCircuitBreakerCS 返回一个 Java 8 完成阶段,这正是我想要的,使用它解决了我的问题,并且异常导致将断路器设置为打开状态。

关于java - 如何将 Akka java 断路器与 CompletableFutures 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40325507/

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