前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf

结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf

作者头像
干货满满张哈希
发布2021-04-12 14:25:57
5590
发布2021-04-12 14:25:57
举报
文章被收录于专栏:干货满满张哈希

系列目录:

  1. Spring WebFlux运用中的思考与对比
  2. CompletableFuture与Spring的Sleuth结合工具类
  3. CommpetableFuture使用anyOf过程中的一些优化思考
  4. 结合CompletableFuture与Spring的Sleuth结合工具类与allOf以及anyOf

之前实现的CompletableFutureWithSpan,不能直接使用anyOf或者allOf。因为查看源码:

代码语言:javascript
复制
public static CompletableFuture allOf(CompletableFuture... cfs) {
    return andTree(cfs, 0, cfs.length - 1);
}

这里的andTree是内部方法,其实就是递归并联所有传入的CompletableFuture。这个递归如何截止呢?主要由以下的方法结束

代码语言:javascript
复制
final void bipush(CompletableFuture b, BiCompletion c) {
    if (c != null) {
        while (result == null) {
            if (tryPushStack(c)) {
                if (b.result == null)
                    b.unipush(new CoCompletion(c));
                else if (result != null)
                    c.tryFire(SYNC);
                return;
            }
        }
        b.unipush(c);
    }
}

非常遗憾,这个方法是final的,修改的field也是内部field,CompletableFutureWithSpan是基于代理实现的,所以直接用原有的allOf还有anyOf是不可行的,继承覆盖bipush也不可行。

只好实现自己的:

代码语言:javascript
复制
public static CompletableFutureWithSpan allOf(Tracer tracer, CompletableFutureWithSpan... cfs) {
        //需要转换
        CompletableFuture[] completableFutures = Arrays.stream(cfs).map(completableFutureWithSpan -> completableFutureWithSpan.completableFuture).collect(Collectors.toList()).toArray(new CompletableFuture[0]);
        return from(CompletableFuture.allOf(completableFutures), tracer);
}


public static CompletableFuture anyOf(Tracer tracer, CompletableFutureWithSpan... cfs) {
    //需要转换
    CompletableFuture[] completableFutures = Arrays.stream(cfs).map(completableFutureWithSpan -> completableFutureWithSpan.completableFuture).collect(Collectors.toList()).toArray(new CompletableFuture[0]);
    return from(CompletableFuture.anyOf(completableFutures), tracer);
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/11/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档