Я использую Play! 2.5 (Java) и Akka. Вот моя проблема: я пытаюсь вызвать внешнюю службу с помощью WSClient и хотел бы, чтобы она была за выключателем Akka. Код, показанный ниже, не работает должным образом.Как использовать автоматический выключатель Akka с CompletableFutures?
Я ожидаю, что автоматический выключатель откроется, когда внешняя услуга недоступна, но это не так. Я предполагаю, что проблема заключается в обертывании выражения лямбда java 8, возвращающего completeableFuture внутри 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()
}
Теперь, открывает автоматический выключатель.