首先上我自己的一个例子(先是同步,再试异步)
@Service
public class ArticleService {
@Autowired
private ArticleClient articleClient;
@Autowired
private UserClient userClient;
@Autowired
private ThreadPoolExecutor threadPoolExecutor;
public ItemVo load(Long id) {
// 1. 查询文章详情 0.5s
// 下面的查询需要用到文章对应的发布用户,所以这里需要使用CompletableFuture.supplyAsync
CompletableFuture<ArticleEntity> articleCompletableFuture = CompletableFuture.supplyAsync(() -> {
ResponseVo<ArticleEntity> skuEntityResponseVo = this.articleClient.getArticleById(id);
ArticleEntity articleEntity = skuEntityResponseVo.getData();
if (articleEntity == null) {
return null;
}
itemVo.setId(id);
itemVo.setTitle(articleEntity.getTitle());
itemVo.setDefaltImage(articleEntity.getDefaultImage());
return articleEntity;
}, threadPoolExecutor);
// 2. 查询文章博主个人信息 0.5s
// 这里查询需要依赖文章关联的用户id,所以需要使用articleCompletableFuture.thenAcceptAsync()
CompletableFuture<Void> userCompletableFuture = articleCompletableFuture.thenAcceptAsync(articleEntity -> {
ResponseVo<UserEntity> categoryResponseVo = this.userClient.queryUserInfoById(articleEntity.getUserId());
UserEntity userEntity = categoryResponseVo.getData();
itemVo.setUserInfo(userEntity);
}, threadPoolExecutor);
// 3. 查询博主相关文章分类 1s
// 这里查询需要依赖文章关联的用户id,所以需要使用articleCompletableFuture.thenAcceptAsync()
CompletableFuture<Void> userOtherArticleCompletableFuture = articleCompletableFuture.thenAcceptAsync(articleEntity -> {
ResponseVo<List<UserAuserOtherArticleEntity>> categoryResponseVo = this.articleClient.queryUserAuserOtherArticleById(articleEntity.getUserId());
UserAuserOtherArticleEntity userAuserOtherArticleEntity = categoryResponseVo.getData();
itemVo.setUserAuserOtherArticleList(userAuserOtherArticleEntity);
}, threadPoolExecutor);
// 4. 查询文章评论 1s
// 不需要依赖其他请求返回值,可以使用新的异步对象 CompletableFuture.runAsync()
CompletableFuture<Void> commentsCompletableFuture = CompletableFuture.runAsync(() -> {
ResponseVo<List<UserArticleCategoryEntity>> userArticleCategoryVo = this.userClient.queryCommentsByArticleId(id);
UserArticleCategoryEntity userArticleCategoryEntity = userArticleCategoryVo.getData();
itemVo.setUserArticleCategoryList(userArticleCategoryEntity);
}, threadPoolExecutor);
// 5. 相关推荐文章 1s
// 不需要依赖其他请求返回值,可以使用新的异步对象 CompletableFuture.runAsync()
CompletableFuture<Void> relatedArticlesCompletableFuture = CompletableFuture.runAsync(() -> {
ResponseVo<List<RelatedArticlesEntity>> userArticleCategoryVo = this.articleClient.queryRelatedArticles(id);
UserArticleCategoryEntity userArticleCategoryEntity = userArticleCategoryVo.getData();
itemVo.setUserArticleCategoryList(userArticleCategoryEntity);
}, threadPoolExecutor);
}
// 多任务执行组合 CompletableFuture.allOf()
CompletableFuture.allOf(articleCompletableFuture, userCompletableFuture, userOtherArticleCompletableFuture,
commentsCompletableFuture, relatedArticlesCompletableFuture).join();
return itemVo;
}