Spring ListenableFuture等待所有项目完成

时间:2019-05-16 18:38:41

标签: spring spring-data-cassandra

我正在使用Spring ListenableFuture执行异步任务。我正在尝试执行以下操作。

  1. 我有对象列表。我将列表分为3个批次。
  2. 我每批都要执行一些异步cassandra操作。
  3. 我必须等到第一批完成后,再取下下一批
  4. 如果批次错误抛出错误,为什么会失败并且不提取下一个批次。

但是由于某些原因,它不能按预期工作。

  1. 即使批次失败,也要提取下一个批次
  2. 即使第一批正在进行,也要提取下一批。

我做错什么了吗

  public void run(String... args) throws Exception {

    List<MyEntity> entities = Arrays.asList(
        new MyEntity("3", "val1"),
        new MyEntity("2", "val1"),
        new MyEntity(null, "val1"),
        new MyEntity("21", "val1")
    );

    partition(entities, 3).forEach(p -> {
      List<ListenableFuture<MyEntity>> futures = new ArrayList<>();
      final CountDownLatch countDownLatch = new CountDownLatch(1);

      entities.stream().forEach(s -> {
        ListenableFuture<MyEntity> future = asyncCassandraOperations.insert(s);
        future.addCallback(it -> {
          countDownLatch.countDown();
          System.out.println("Pass" + it);
        }, throwable -> {
          countDownLatch.countDown();
          System.out.println("fail");
        });
        futures.add(future);
      });

      futures.forEach(f -> {
        try {
          f.get();
        } catch (Exception e) {
          throw new RuntimeException(e);
        }
      });

      try {
        countDownLatch.await();
      } catch (Exception e) {
        throw new RuntimeException(e);
      }

      System.out.println("done patch");
    });

    System.out.println("done all");

  }

0 个答案:

没有答案