我正在使用Play! 2.5(Java)和Akka。这是我的问题:我试图使用WSClient调用外部服务,并且希望它位于Akka断路器后面。我在下面显示的代码似乎无法按预期工作。
我希望断路器无法在外部服务无法接通时打开,但无法接通。我猜问题是包装在akaa.dispatch.Future.future内的java 8 lambda表达式中返回一个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()
}
现在,断路器打开。
最佳答案
我想出了如何使其工作的方法。使用callWithCircuitBreakerCS返回我想要的Java 8完成阶段,使用该问题解决了我的问题,并且异常导致将断路器设置为打开状态。