繁体   English   中英

如何使用CompletableFuture等到任务列表完成?

[英]How to wait until list of tasks are done using CompletableFuture ?

我正在尝试CompletableFutures,希望有人可以帮助转身。 我的算法如下:

  1. 我有文章清单。
  2. 我调用REST API来获取每个文章的类别。
  3. 我将类别保存到数据库。
  4. 我想以并行方式执行步骤2和3。

我想等到所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM