2016-10-30 3 views
0

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

, 차단기가 열립니다.

답변

2

나는 그것이 작동하도록하는 방법을 알아 냈습니다. callWithCircuitBreakerCS를 사용하면 고정 된 내 문제를 사용하고 예외로 인해 회로 차단기를 열린 상태로 설정하는 Java 8 완료 단계가 반환됩니다.