Одновременная загрузка пружины http post запроса

#spring-boot #asynchronous #http-post #simultaneous-calls

#пружинный ботинок #асинхронный #http-сообщение #одновременные вызовы

Вопрос:

Привет, у меня есть список размером 500 кб, и я должен сделать запрос на сервер с параметрами хэша.

Сервер принимает массив JSON из 200 объектов. таким образом, я мог бы отправлять по 200 товаров каждый раз. Но все же мне нужно каждый раз разделять список и отправлять эту часть на сервер.

У меня есть метод для этого, который выполняет http-запрос post. и я хочу использовать параметры загрузки spring (если они доступны), чтобы вызвать метод с разными потоками, получить ответ обратно и объединить их в один.

Ответ №1:

Я сделал это с помощью java CompletableFuture class без каких-либо тегов springboot. но вы могли бы использовать @async и для своего метода. пример кода :

         var futures = new ArrayList<CompletableFuture<List<Composite>>>();
        var executor = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

        for (List<CompositeRecord> records : Lists.partition(recordsList, 200)) {
            var future = CompletableFuture.supplyAsync(() -> /* call your method here */, executor);
            futures.add(future);
            Thread.sleep(2000);
        }

        CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).exceptionally(ex -> null).join(); // avoid throwing an exception in the join() call
        var futureMap = futures.stream().collect(Collectors.partitioningBy(CompletableFuture::isCompletedExceptionally));
        var compositeWithErrorList = new ArrayList<Composite>();
        futureMap.get(false).forEach(l -> {
            try {
                compositeWithErrorList.addAll(l.get());
            } catch (InterruptedException | ExecutionException e) {
                e.printStackTrace();
            }
        });
 

после выполнения кода у вас будет карта выполненных и отмененных фьючерсов.