java 多线程调用请求头丢失

彩我一生 2021-05-07 10:25:35
1.通过主线程调用m1方法,请求头存在,sra 不为空
2.另起一个线程调用m1方法,请求头丢了,sra为null,网上找了好多方法,基本都是这样设置的,为啥我的不行。


@PostMapping(value = "/test")
public String postTest(HttpServletRequest request, @RequestBody Stu stu){
ExecutorService exe = Executors.newSingleThreadExecutor();
TestService testService = new TestService();
testService.m1();
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
RequestContextHolder.setRequestAttributes(sra, true);
CompletableFuture.runAsync(()->{
testService.m1();
},exe);
return "11";
}

class TestService {
int m1(){
ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
try {//模拟远程调用 耗时5秒钟
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 1;
}
}
...全文
1440 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
RockeyCui 2021-05-11
  • 打赏
  • 举报
回复
你看一下 RequestContextHolder 的源码不就知道了,
private static final ThreadLocal<RequestAttributes> requestAttributesHolder = new NamedThreadLocal("Request attributes"); 只在当前线程保存,切换线程自然就么有了。
青木雨 2021-05-11
  • 打赏
  • 举报
回复
异步调用,上下文已切换,新的线程没有servlet上下文了
weixin_43922513 2021-05-07
  • 打赏
  • 举报
回复
说明异步调用,sra 还没有初始化成功,所以值为null

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧