项目中有个业务场景
向A服务某接口发起请求,核心逻辑执行完成后,使用Springboot的@Async注解去异步推送通知
在异步方法中,需要用feign调用B服务获取相关数据,因为有鉴权的存在,所以异步方法调用B服务接口的时候也要携带token
那么就涉及到线程上下文的问题,配置了线程池,然后设置了线程上下文的数据切换(见下图)
然后一个很诡异的问题产生了,比如业务执行10次,那么偶尔会有几次token为null的情况...
在网上找了很多资料,也没有找到解决办法和类似的问题。
大神救救孩子吧~
jdk版本1.8.161
主线程调用核心逻辑 , @Async异步调用服务 , 然后异步里面再用线程池执行 ? 异步里面调用异步我感觉会有很多奇怪的问题
你看能不能在异步调用里面把token作为方法的参数来传递或者别的方式 , 而不是放在RequestAttribute里面
问题:子线程里边保存的是主线程的requestAttribute的引用,当主线程调用完后,会将该request置为空,所以当主线程优先于子线程执行完成的情况下,子线程获取到的request为空。
解决:包装复制主线程的request信息,然后设置到子线程。