Как использовать CompletableFuture и CompletionStage с обработкой исключений - PullRequest
0 голосов
/ 17 мая 2018

Я имею дело с некоторым кодом, включающим несколько операций ввода-вывода с блокировкой, которые должны выполняться последовательно.Контекст представляет собой веб-приложение на основе JVM, работающее на Java 8 и Tomcat.У меня есть код, который выполняет три операции в последовательности.Все они имеют блокирующий характер, и выходные данные каждой операции могут использоваться в последующей операции.Каждая операция может выдавать исключения, как проверенные, так и непроверенные.Я проиллюстрировал несколько примеров исключений, которые могут быть выданы:

String output1 = callToRestAPI(); // throws MalformedUrlException, ConcurrentModificationException

callToDatabase(output1); // throws SQLException, ConcurrentModificationException

boolean output2 = callToSendEmail(output1); // throws MessagingException

Как бы я написал это, используя многообещающие (без каламбура) Java 8 CompletionStage и CompletableFuture?

1 Ответ

0 голосов
/ 30 июня 2018

Надеюсь, это поможет.

import java.util.concurrent.CompletableFuture;

public class HandleException {

  public static void main(String[] args) {
    CompletableFuture.completedFuture(null)
        .thenApply(__ -> callToRestAPI())
        .thenApply(
            output1 -> {
              callToDatabase(output1);
              return output1;
            })
        .thenAccept(output1 -> callToSendEmail(output1))
        .exceptionally(
            t -> {
              System.out.println("Exception occurred: " + t.getMessage());
              return null;
            });
  }
}

thenApply и thenAccept используется, когда код блокируется. thenApply используется, когда мы хотим вернуть что-то следующему методу thenXXX. тогда Accept не возвращает ничего. Вы также можете сделать callToRestAPI, callToDatabase как Async (неблокирующий код), используя runAsync или supplyAsync

...