#spring-boot #asynchronous #http-post #simultaneous-calls
#пружинный ботинок #асинхронный #http-сообщение #одновременные вызовы
Вопрос:
Сервер принимает массив 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();
}
});
после выполнения кода у вас будет карта выполненных и отмененных фьючерсов.