private static ExecutorService executorService = new ThreadPoolExecutor(10,20,1000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>());
public CompletableFuture<Map<Long, List<Student>>> asyncBatchQueryStudentListCompletableFuture(List<Long> studentList) {
if (CollectionUtils.isEmpty(studentList)) {
return CompletableFuture.completedFuture(Maps.newHashMap());
}
//请求数量过多时,做分批异步处理
List<List<Long>> studentIdsList = ListUtils.partition(studentList, 50);
List<CompletableFuture<Map<Long, List<Student>>>> futureList = Lists.newArrayList();
try {
for (List<Long> studentIds : studentIdsList) {
if (CollectionUtils.isEmpty(studentIds)) {
continue;
}
CompletableFuture<Map<Long, List<Student>>> tmpFuture =
CompletableFuture.supplyAsync(() -> getStudentInfoList(), executorService);
futureList.add(tmpFuture);
}
//合并future,并聚合各个future的结果
return CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]))
.thenApply(v -> futureList.stream()
.map(CompletableFuture::join)
.reduce(Maps.newHashMapWithExpectedSize(studentList.size()), (v1, v2) -> {
v1.putAll(v2);
return v1;
})
);
} catch (Exception e) {
log.error(e.getMessage);
}
return CompletableFuture.completedFuture(Maps.newHashMap());
}
【java】一个list分批传入下游接口并获取返回数据
最新推荐文章于 2024-08-16 15:46:14 发布