2016-08-28 3 views
2

Я пытался. Исключительно и .handle, но они, похоже, не работают. В scala вы можете вызывать метод в будущем с закрытием, которое подобно блоку finally (оно выполняется при исключении AND при успешном завершении). И он пропагандирует исключение или успех в цепочке as-is.Как вызвать CompletableFuture callback при распространении результата или ошибки?

Я попытался это ...

CompletableFuture<Object> future = newFuture.handle((r, e) -> { 
     if(r != null) 
      return r; 
     else if(e != null) 
      return e; 
     else 
      return new RuntimeException("Asdf");    
    }); 

    Assert.assertTrue(future.isCompletedExceptionally()); 

но тест не в будущем полностью успешно с результатом исключения (как странно).

+0

Чтобы правильно распространять исключения в 'handle()', вам нужно «бросить» их. В противном случае, ответ, в котором указывается, что вы должны использовать 'whenComplete', если вам просто нужны побочные эффекты без преобразования результата, это лучший подход. – acelent

ответ

3

Использование CompletableFuture#whenComplete(BiConsumer). Его Javadoc состояния

Возвращает новый CompletionStageс тем же результатом или исключения как этот этап, который выполняет данное действие, когда этот этап завершается.

Когда этот этап завершен, данное действие вызывается с результата (или null, если нет) и исключения (или null, если нет) этой стадии в качестве аргументов. Возвращаемый этап завершается, когда возвращается действие . Если входящее в поставку действие вызывает исключение, то возвращенный этап исключительно завершает это исключение, если только этот этап также выполнен исключительно.

Другими словами, он будет вызван независимо от успеха или неудачи, и будет распространяться состояние первоначального Будущего (если BiConsumer не бросает исключение).

CompletableFuture<String> future2 = newFuture.whenComplete((r, e) -> { 
    // consume the result 
}); 

Если вам необходимо преобразовать результат (в вашем примере, вы не), то вы можете использовать handle и распространять вещи самостоятельно.

0

Ohhhhh, я думаю, что я получил это .... что-то вроде этого, кажется, работает

CompletableFuture<Integer> future2 = newFuture.handle((r, e) -> { 

     //put finally like logic right here.... 

     if(r != null) 
      return r; 
     else if(e != null) 
      throw new RuntimeException(e); 
     else 
      throw new RuntimeException("weird"); 
    }); 
Смежные вопросы