2.2K Star 15.5K Fork 9.3K

JEECG / jeecg-boot

 / 详情

异步线程中调用openFeign访问远程服务,子线程的header中偶尔出现取不到token的情况

已完成
创建于  
2022-01-10 17:39
版本号:

jeecg-boot 2.4.2

问题描述:

异步线程中调用openFeign访问远程服务,子线程的header中偶尔出现取不到token的情况

截图&代码:

业务代码:
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
CompletableFuture.runAsync(() -> {
RequestContextHolder.setRequestAttributes(requestAttributes);
sysBaseApi.getUserById(id);

});
feign配置:
public class FeignConfig{
@guhaibin
public RequestInterceptor requestInterceptor() {
return requestTemplate -> {
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (null != attributes) {
HttpServletRequest request = attributes.getRequest();
log.info("Feign request: {}", request.getRequestURI());
// 将token信息放入header中
String token = request.getHeader(CommonConstant.X_ACCESS_TOKEN);
if(token==null){
token = request.getParameter("token");
}
log.info("Feign request token: {}", token);
requestTemplate.header(CommonConstant.X_ACCESS_TOKEN, token);
}
};
}
}

友情提示(为了提高issue处理效率):

RequestContextHolder基于ThreadLocal实现线程间共享数据,openFeign通过RequestContextHolder获取request里的数据。
原因分析:主线程执行慢,取token时Request还存活,后续正常;主线程执行的快,子线程还没构造出来主线程已经结束,Request被销毁,那么子线程就拿不到token了。

评论 (2)

qiuyd 创建了任务

收录 yf

微服务之间调用免Token方案
http://doc.jeecg.com/2725212

多线程的话,需要你给每个线程设置token

JEECG 任务状态待办的 修改为已完成

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(2)
57093 jeecg 1662000782
Java
1
https://gitee.com/jeecg/jeecg-boot.git
git@gitee.com:jeecg/jeecg-boot.git
jeecg
jeecg-boot
jeecg-boot

搜索帮助