接口调用service 以下为service方法的处理逻辑 如果接口被频繁调用的话 建议还是加缓存
public Result getList(String tenantId) {
ExecutorService executor = null;
try{
List<UserVo> list = mapper.getList(tenantId);
//这里假设启动10个线程
executor = Executors.newFixedThreadPool(10);
//赋值头像 需要网络请求 其实不建议
List<CompletableFuture<Void>> futures = new ArrayList<>();
for (UserVo user : list) {
CompletableFuture<String> avatarFuture = CompletableFuture.supplyAsync(() -> {
try {
return userApi.getUserAvatar(user.getId());
} catch (Exception e) {
// 抛出异常
throw new RuntimeException("userApi->getUserAvatar error", e);
}
},executor);
// 使用thenAccept来更新DataObject,注意thenAccept不返回新的CompletableFuture
CompletableFuture<Void> updateFuture = avatarFuture.thenAccept(avatar -> d.setVisitorsAvatar(avatar));
// 如果你需要跟踪这些Void的CompletableFuture,可以将它们添加到列表中
// 但实际上,你可能只需要等待avatarFuture的完成
// 或者,如果你确实需要,可以添加avatarFuture
futures.add(updateFuture);
}
// 等待所有头像URL的获取和DataObject的更新完成
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));
// 阻塞当前线程,直到allFutures代表的所有异步操作都完成
allFutures.get();
return Result.success(list,"请求成功");
}catch (Exception e) {
log.error("失败",e);
return Result.fail(CodeEnum.Error,e.getMessage());
}finally {
// 在这里关闭Executor,无论是否发生异常
if (executor != null){
executor.shutdown();
}
}
}