Вы должны использовать join()
, чтобы дождаться окончания всей нити.
Создать Map<String, Boolean> result
, чтобы сохранить результат запроса.
В вашем контроллере:
public void yourControllerMethod() {
CompletableFuture.runAsync(() -> yourServiceMethod());
}
К вашим услугам:
// Execute your logic to get List<String> urls
List<CompletableFuture> futures = urls.stream().map(v ->
CompletableFuture.supplyAsync(url -> requestUrl(url))
.thenAcceptAsync(requestResult -> result.put(url, true or false))
).collect(toList()); // You have list of completeable future here
Затем используйте .join()
для ожидания всех потоков (помните, что ваша служба уже выполняется в своем собственном потоке)
CompletableFuture.allOf(futures).join();
Затем вы можете определить, какой из них успешен / неудач, открыв result
map
Редактировать
Пожалуйста, опубликуйте код процедуры, чтобы другие могли вас понять.
Я прочитал ваш код и вот необходимые изменения:
Когда этот цикл for не был закомментирован, веб-сервер получателя получил
один и тот же запрос дважды,
Я не понимаю цель этого цикла.
Извините в моем предыдущем ответе, я не убрал его. Это просто временная идея, которую я забыл удалить в конце: D
Просто удалите его из кода
// allOf () принимает только массивы, поэтому список необходимо преобразовать
/ * Код никогда не преодолеет эту часть (я знаю, что allOf () является блокирующим вызовом), даже спустя много времени после того, как получатель получил HTTP-запрос
with the correct payload. I'm not sure yet where exactly the code gets stuck */
Ваша карта должна быть ConcurrentHashMap
, потому что вы изменяете ее одновременно позже.
Map<String, Boolean> result = new ConcurrentHashMap<>();
Если ваш код все еще не работает должным образом, я предлагаю удалить часть parallelStream()
.
CompletableFuture
и parallelStream
используют общий пул разветвлений. Я думаю, что бассейн исчерпан.
И вы должны создать свой собственный пул для CompletableFuture
:
Executor pool = Executors.newFixedThreadPool(10);
И выполнить ваш запрос, используя этот пул:
CompletableFuture.supplyAsync(YOURTASK, pool).thenAcceptAsync(Yourtask, pool)