Как объединить результат выполнения двух CompletableFutures?JAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Как объединить результат выполнения двух CompletableFutures?

Сообщение Гость »

Наш микросервис вызывает конечную точку партнерского микросервиса. Но из-за изменений в партнерском микросервисе теперь результат, предоставленный одной конечной точкой, будет предоставляться при вызове двух разных конечных точек. Вот почему мне приходится разделить вызов на два вызова и объединить результаты.
Поэтому я определил два метода:

Код: Выделить всё

    @Async("executor")
public CompletableFuture[*]> getDashboardItemsFuture1()

@Async("executor")
public CompletableFuture getDashboardItemsFuture2()

и внутри каждого из этих методов я выполняю вызов rest и передаю результат экземпляру
CompletableFuture следующим образом:

Код: Выделить всё

    @Async("executor")
public CompletableFuture getDashboardItemsFuture1() {
return CompletableFuture.completedFuture(executeRestCall())
}

И я хотел бы объединить результаты двух CompletableFutures таким образом:
  • Ожидается, пока все вызовы REST завершают свое выполнение.
    Если при выполнении одного из вызовов REST выдается исключение (например, TimeoutException), результат другого вызова REST все равно возвращается из нашего микросервиса.
Итак, мой код для этой логики:

Код: Выделить всё

       var dashboardItemsFuture1 = getDashboardItemsFuture1();
var dashboardItemsFuture2 = getDashboardItemsFuture1()

var combinedFuture = CompletableFuture.allOf(dashboardItemsFuture1, dashboardItemsFuture2);

try {
combinedFuture.get(); // Wait for both futures to complete
} catch (Exception exc) {
// Handle exceptions
log.error(exc);
}

Optional.ofNullable(dashboardItemsFuture1.get())
.ifPresent(dashboardItems::addAll);

Optional.ofNullable(dashboardItemsFuture2.get())
.ifPresent(dashboardItems::addAll);
Но, очевидно, это не сработает, так как когда я моделировал в UnitTest исключение во время вызова REST первого CompletableFuture, исключение было выброшено только в этой строке:

Код: Выделить всё

var dashboardItemsFuture1 = getDashboardItemsFuture1();
Итак, как правильно объединить два CompletableFuture так, как я хочу?

Источник: https://stackoverflow.com/questions/780 ... blefutures
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»