【问题标题】:How do i use Akka java circuit breaker with CompletableFutures?如何将 Akka java 断路器与 CompletableFutures 一起使用?
【发布时间】:2016-10-30 02:20:56
【问题描述】:

我正在使用 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()
    }  

现在,断路器打开。

【问题讨论】:

    标签: java playframework akka akka-http playframework-2.5


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-11
      • 2016-07-23
      • 1970-01-01
      • 2019-02-19
      • 2016-05-02
      • 1970-01-01
      • 1970-01-01
      • 2016-09-15
      相关资源
      最近更新 更多