Собрать сгенерированные исключения из CompletableFuture.allOf () выполнения - PullRequest
1 голос
/ 10 февраля 2020

Имея следующий рабочий код:

  public static void main(String[] args) throws ExecutionException, InterruptedException {

    CompletableFuture<Void> process1 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 1 with exception");
      throw new RuntimeException("Exception 1");
    });

    CompletableFuture<Void> process2 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 2 without exception");
    });

    CompletableFuture<Void> process3 = CompletableFuture.runAsync(() -> {
      System.out.println("Process 3 with exception");
      throw new RuntimeException("Exception 3");
    });

    CompletableFuture<Void> allOfProcesses = CompletableFuture.allOf(process1, process2, process3);

    allOfProcesses.get();
  }

Я ищу способ собрать все исключения, которые были сгенерированы во время параллельного выполнения в CompletableFuture.allOf(), и отобразить его в List.

Я знаю, что могу сделать это, возвращая исключение (CompletableFuture<Exception>) вместо того, чтобы бросать и собирать его с помощью CompletableFuture::join, но я думаю, что подход к выбрасыванию исключений лучше, чем возвращать и выбрасывать его позже

1 Ответ

2 голосов
/ 10 февраля 2020

Если вы хотите избежать возврата CompletableFuture<Exception> и просто иметь возможность сначала бросить, а затем все же быть в состоянии что-то сделать, то будет получено исключение из всех CompletableFuture s.

В этом случае вы можете используйте CompletableFuture::exceptionally для сбора исключений:

private static List<Throwable> collectedExceptions = Collections.synchronizedList(new ArrayList<>());

public static void main(String[] args) throws ExecutionException, InterruptedException {

    CompletableFuture<Void> process1 = CompletableFuture.runAsync(() -> {
        System.out.println("Process 1 with exception");
        throw new RuntimeException("Exception 1");
    }).exceptionally(exception -> {
        // Handle your exception here
        collectedExceptions.add(exception);
        return null;
    });

    CompletableFuture<Void> process2 = CompletableFuture.runAsync(() -> {
        System.out.println("Process 2 without exception");
    });

    CompletableFuture<Void> process3 = CompletableFuture.runAsync(() -> {
        System.out.println("Process 3 with exception");
        throw new RuntimeException("Exception 3");
    }).exceptionally(exception -> {
        // Handle your exception here
        collectedExceptions.add(exception);
        return null;
    });

    CompletableFuture<Void> allOfProcesses = CompletableFuture.allOf(process1, process2, process3);

    allOfProcesses.get();
    assert (collectedExceptions.size() == 2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...