多线程处理业务,调用feign接口,会偶发的丢失token

问题遇到的现象和发生背景

如下代码中,多线程处理业务,doSomeThing方法中会调用其他服务的feign方法,有一定的几率出现invalidte token : ***

问题相关代码,请勿粘贴截图
//获取原线程的请求参数
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
// 异步处理各种情况
        List<CompletableFuture<AsyncResult>> futureList = orderList
                .stream()
                .map(order->
                        CompletableFuture.supplyAsync(()->{
                            //设置请求原线程下的参数
                            RequestContextHolder.setRequestAttributes(attributes,true);
                            return this.doSomeThing(order);
                        },orderEditThreadPool))
                .collect(Collectors.toList());
        CompletableFuture<Void> allCF = CompletableFuture.allOf(futureList.toArray(new CompletableFuture[0]));
        allCF.join();

请问为什么会出现这种情况,主要是想知道原因,不是想知道解决方案。

能确定token invalid的原因吗

  1. 缺失token
  2. token串错误
  3. token已经被使用
  4. token超时失效

很有意思的问题,拿你的代码测试了下,服务重启以后,立马走你这个接口,开始跑的几个线程,大概率空,(我本地把线程池的最大线程数设置的比较少,每次必现,不是偶现)每次当我线程debug的时候,却发现数据都有了,
我在猜想,是不是getParameter这个方法,并不是线程安全的,然后跟着看了下getParam的处理,里面确实东西不少,
同样几个线程一起跑到getParam的时候,

img


假设最先执行到这里的时候线程a刚把parametersParsed改成true,还没有执行下面具体的解析代码,此时刚好有个线程b走到上面那个图的if判断那里,发现数据解析的标记已经是true了,直接就去属性中取数据了,但是a线程压根就没开始解析数据,绝对是拿不到数据的

img


为了验证这个说法,那我就测试了下,既然我多线程中可能没有完成getparam需要的初始化操作,那我多线程触发前,手动调用一次getParam,是不是就没有这个问题了,再次测试看看是不是这样

img


img