2016-10-30 7 views
0

Я использую 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() 
    } 

Теперь, открывает автоматический выключатель.

ответ

2

Я понял, как заставить его работать. Использование callWithCircuitBreakerCS возвращает этап завершения Java 8, который я хочу, используя эту исправленную мою проблему, и исключения приводят к тому, что коммутатор отключается в открытом состоянии.

 Смежные вопросы

  • Нет связанных вопросов^_^