结合CompletableFuture与Spring的Sleuth结合工具类与allOf

简介: 结合CompletableFuture与Spring的Sleuth结合工具类与allOf

系列目录:

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

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

public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) {
    return andTree(cfs, 0, cfs.length - 1);
}

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

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也不可行。

只好实现自己的:

public static CompletableFutureWithSpan<Void> 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<Object> 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);
}
相关文章
|
11天前
|
消息中间件 SpringCloudAlibaba Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(八)Config服务配置+bus消息总线+stream消息驱动+Sleuth链路追踪
802 0
|
11天前
|
开发框架 Java 数据库
|
11天前
|
缓存 小程序 Java
|
11天前
|
监控 Java Docker
【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识
【Spring Cloud Sleuth 分布式链路跟踪】 —— 每天一点小知识
104 0
|
5月前
|
Java Apache Spring
Spring BeanUtils 2、Cglib BeanCopier 3、Apache BeanUtils 4、Apache PropertyUtils 5、Dozer 那么,我们到底应该选择哪种工具类更加合适呢?为什么Java开发手册中提到禁止使用Apache BeanUtils呢
Spring BeanUtils 2、Cglib BeanCopier 3、Apache BeanUtils 4、Apache PropertyUtils 5、Dozer 那么,我们到底应该选择哪种工具类更加合适呢?为什么Java开发手册中提到禁止使用Apache BeanUtils呢
65 0
|
7月前
|
存储 NoSQL Java
Spring Boot 如何编写一个通用的 Redis 工具类
Spring Boot 如何编写一个通用的 Redis 工具类
214 0
Spring Boot 如何编写一个通用的 Redis 工具类
|
7月前
|
Java Spring
【Spring】org.springframework.util.StringUtils工具类中commaDelimitedListToStringArray的使用
【Spring】org.springframework.util.StringUtils工具类中commaDelimitedListToStringArray的使用
40 0
|
9月前
|
Java Spring
动态获取spring管理的bean工具类
动态获取spring管理的bean工具类
117 0
|
消息中间件 存储 监控
Spring Cloud Sleuth 全链路日志跟踪解决方案(强烈推荐)
Spring Cloud Sleuth 全链路日志跟踪解决方案(强烈推荐)
|
消息中间件 JavaScript 小程序
别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有, 建议收藏!!
别再自己瞎写工具类了,Spring Boot 内置工具类应有尽有, 建议收藏!!