Назад к вопросам
Т-Банк
Senior
7
Как параллельно сходить в несколько сервисов для сборки отчёта?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Для параллельного вызова нескольких сервисов в Java можно использовать CompletableFuture. Это позволяет запускать асинхронные задачи и затем объединять их результаты.
Пример:
import java.util.concurrent.*;
import java.util.*;
public class ReportService {
private ExecutorService executor = Executors.newFixedThreadPool(10);
public Report buildReport() throws ExecutionException, InterruptedException {
CompletableFuture<String> service1 = CompletableFuture.supplyAsync(() -> callService1(), executor);
CompletableFuture<String> service2 = CompletableFuture.supplyAsync(() -> callService2(), executor);
CompletableFuture<String> service3 = CompletableFuture.supplyAsync(() -> callService3(), executor);
// Ждём, пока все завершатся
CompletableFuture<Void> allDone = CompletableFuture.allOf(service1, service2, service3);
// После завершения собираем результаты
allDone.get();
String result1 = service1.get();
String result2 = service2.get();
String result3 = service3.get();
// Собираем отчёт из результатов
return assembleReport(result1, result2, result3);
}
private String callService1() {
// вызов первого сервиса
return "data1";
}
private String callService2() {
// вызов второго сервиса
return "data2";
}
private String callService3() {
// вызов третьего сервиса
return "data3";
}
private Report assembleReport(String r1, String r2, String r3) {
// логика сборки отчёта
return new Report(r1, r2, r3);
}
static class Report {
String part1, part2, part3;
public Report(String p1, String p2, String p3) {
this.part1 = p1;
this.part2 = p2;
this.part3 = p3;
}
}
}
Такой подход позволяет эффективно использовать потоки и не блокировать основной поток, ожидая каждый сервис по отдельности. Можно также обрабатывать ошибки и таймауты, используя методы CompletableFuture.