在未来可完成的循环中从数据库获取结果
Get result from db in a loop with completable future
我正在使用 Spring Boot 和 Spring Data Jpa,我的逻辑由数据库中的 3 个请求组成,我想 运行 并行处理。我想为此目的使用 CompletableFuture。
最后我需要根据 5 db 查询 运行s 的结果构建响应对象。目前我正在 运行循环其中的 3 个。
所以我创建了 CompletableFuture
CompletableFuture<Long> totalFuture = CompletableFuture.supplyAsync(() -> myRepository.getTotal());
CompletableFuture<Long> countFuture = CompletableFuture.supplyAsync(() -> myRepository.getCount());
然后我计划在这个未来使用 .allOf。但是我有循环调用的问题。如何重写它以在每个请求中使用 callable 我需要从请求中传递值,然后按键排序到映射中?
Map<String, Integer> groupcount = new HashMap<>();
request.ids().forEach((key, value) -> count.put(key, myRepository
.getGroupCountId(value));
为了更透彻地解释,我发布了一个我想链接的代码片段,但目前它是这样工作的。
List<CompletableFuture<Void>> completableFutures = new ArrayList<>();
Map<String, Integer> groupcount = new ConcurrentHashMap<>();
for (var id : request.Ids().entrySet()) {
completableFutures.add(
CompletableFuture.runAsync(someOperation, EXECUTOR_SERVICE)
.thenApply(v -> runQuery(v.getValues))
.thenAcceptAsync(res-> groupcount .put(v.key, res));
}
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])).get();
我正在使用 Spring Boot 和 Spring Data Jpa,我的逻辑由数据库中的 3 个请求组成,我想 运行 并行处理。我想为此目的使用 CompletableFuture。
最后我需要根据 5 db 查询 运行s 的结果构建响应对象。目前我正在 运行循环其中的 3 个。
所以我创建了 CompletableFuture
CompletableFuture<Long> totalFuture = CompletableFuture.supplyAsync(() -> myRepository.getTotal());
CompletableFuture<Long> countFuture = CompletableFuture.supplyAsync(() -> myRepository.getCount());
然后我计划在这个未来使用 .allOf。但是我有循环调用的问题。如何重写它以在每个请求中使用 callable 我需要从请求中传递值,然后按键排序到映射中?
Map<String, Integer> groupcount = new HashMap<>();
request.ids().forEach((key, value) -> count.put(key, myRepository
.getGroupCountId(value));
为了更透彻地解释,我发布了一个我想链接的代码片段,但目前它是这样工作的。
List<CompletableFuture<Void>> completableFutures = new ArrayList<>();
Map<String, Integer> groupcount = new ConcurrentHashMap<>();
for (var id : request.Ids().entrySet()) {
completableFutures.add(
CompletableFuture.runAsync(someOperation, EXECUTOR_SERVICE)
.thenApply(v -> runQuery(v.getValues))
.thenAcceptAsync(res-> groupcount .put(v.key, res));
}
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture[0])).get();