![](/img/trans.png)
[英]Java: Wait in a loop until tasks of ThreadPoolExecutor are done before continuing
[英]How to wait until list of tasks are done using CompletableFuture ?
我正在尝试CompletableFutures,希望有人可以帮助转身。 我的算法如下:
我想等到所有Articles都处理完后,因此第二个log.info()之后没有异步完成的工作。
我的代码如下:
log.info("Starting CustomCommandLineRunner");
List<Article> articles = articleService.getArticlesAvaialbleForAnalysis();
List<CompletableFuture<Article>> futureArticlesList = articles.stream()
.map(article -> {
CompletableFuture<Map<String, Double>> futureCategoriesMap = categoryService.getArticleCategories(article.getUrl());
return futureCategoriesMap.thenApply(categoriesMap -> articleService.setCatgoriesForArticle(article, categoriesMap));
})
.collect(Collectors.toList());
CompletableFuture<Void> allArticlesFuture = CompletableFuture.allOf(futureArticlesList.toArray(new CompletableFuture[futureArticlesList.size()]));
allArticlesFuture.get();
log.info("Ended CustomCommandLineRunner");
不幸的是articleService.setCatgoriesForArticle()
被调用了两次。 你能把我推向正确的方向吗?
对于虚假的消防演习,我深表歉意。 有问题的代码按预期工作。 articleService.setCatgoriesForArticle()
不会被调用两次,但是Spring @Transactional
在CompletableFutures上不能很好地工作,这会导致相同实体的双重保存问题。
经验教训:不要将@Transactional
与异步代码混合使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.