Springboot异步方法,线程上下文传递丢失问题

项目中有个业务场景
向A服务某接口发起请求,核心逻辑执行完成后,使用Springboot的@Async注解去异步推送通知

在异步方法中,需要用feign调用B服务获取相关数据,因为有鉴权的存在,所以异步方法调用B服务接口的时候也要携带token

那么就涉及到线程上下文的问题,配置了线程池,然后设置了线程上下文的数据切换(见下图)
图片说明

然后一个很诡异的问题产生了,比如业务执行10次,那么偶尔会有几次token为null的情况...

在网上找了很多资料,也没有找到解决办法和类似的问题。
大神救救孩子吧~
jdk版本1.8.161

1个回答

主线程调用核心逻辑 , @Async异步调用服务 , 然后异步里面再用线程池执行 ? 异步里面调用异步我感觉会有很多奇怪的问题
你看能不能在异步调用里面把token作为方法的参数来传递或者别的方式 , 而不是放在RequestAttribute里面

qq_38167579
农夫丶果园 回复anxyh: 我之前遇到过切面里面调用异步的 , 切面里面获取的request对象是正常的 , 但是我把request对象通过方法参数传过去 , 异步方法那边接收到的request对象里面什么信息都没有 , 也是疑惑了很久
大约 2 个月之前 回复
anxyh_name
anxyh 作为参数传递肯定是可以的,但不可能每一个需要被其他服务调用的接口都使用这种方式吧?按理说线程池应该不会影响这个情况产生啊
大约 2 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问