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