如何在CompletableFutures中使用Akka java断路器?

时间:2016-10-30 02:20:57

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

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

我希望在外部服务无法访问时打开断路器,但它没有。我猜测问题在于包装一个java 8 lambda表达式,在 akaa.dispatch.Future.future 中返回 completableFuture

我的代码看起来是否正确?如果有什么问题我该怎么办呢?

    @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()
    }  

现在,断路器打开了。

1 个答案:

答案 0 :(得分:2)

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