Play!를 사용하고 있습니다. 2.5 (Java) 및 Akka. 여기에 내 문제가있다 : WSClient를 사용하여 외부 서비스를 호출하려고하는데 Akka 회로 차단기 뒤에 있어야한다. 아래에 표시된 코드는 예상대로 작동하지 않는 것 같습니다.CompletableFutures에서 Akka java 회로 차단기를 어떻게 사용합니까?
외부 서비스에 연결할 수없는 경우 회로 차단기가 열리기를 기대하지만 그렇지 않습니다. 문제가있는 것 같아 completablefutureakaa.dispatch.Future.future 안에 반환하는 자바 8 람다 식 래핑하는 것입니다.
코드가 올바르게 보이나요? 뭔가 잘못되면 어떻게 해결할 수 있습니까?
@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()
}
, 차단기가 열립니다.