Sobes.tech
Назад к вопросам
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.