【发布时间】:2018-07-26 18:21:32
【问题描述】:
我正在试验 CompletableFutures,希望有人能帮助扭转局面。我的算法如下:
- 我有文章列表。
- 我调用 REST API 来获取每篇文章的类别。
- 我将类别保存到 DB。
- 我想并行执行第 2 步和第 3 步。
我想等到所有文章都处理完毕,所以在第二个 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() 被调用了两次。你能把我推向正确的方向吗?
【问题讨论】:
-
您是否尝试过使用
ExecutorService?或者您是否尝试过使用CompletableFuture.isDone() -
附带说明,您可以使用更简单的
CompletableFuture.allOf(futureArticlesList.toArray(new CompletableFuture[0]));;指定大小不会提高性能,请参阅this great article on that topic...
标签: java java-stream completable-future