Spring Boot子线程访问主线程Request信息:问题与解决方案
在Spring Boot应用中,Controller层发起异步任务,Service层使用新线程处理时,子线程往往无法访问主线程的HttpServletRequest对象,导致无法获取请求信息(如请求头中的用户信息)。本文分析此问题并提供解决方案。
问题描述:
Controller层启动一个任务,Service层在新线程中执行。Controller返回响应后,子线程无法获取主线程的HttpServletRequest对象,无法访问请求信息。例如,以下代码中,子线程无法获取userid:
// Controller@RestControllerpublic class MyController { private static final InheritableThreadLocal<HttpServletRequest> requestHolder = new InheritableThreadLocal<>(); @Autowired private MyService myService; @GetMapping("/test") public String test(HttpServletRequest request) { String userid = request.getHeader("userid"); System.out.println("Main thread userid: " + userid); // 主线程可以获取 requestHolder.set(request); new Thread(() -> myService.process(requestHolder)).start(); return "OK"; }}// Service@Servicepublic class MyServiceImpl implements MyService { @Override public void process(InheritableThreadLocal<HttpServletRequest> requestHolder) { HttpServletRequest request = requestHolder.get(); String userid = request.getHeader("userid"); System.out.println("Child thread userid: " + userid); // 子线程尝试获取 }}
登录后复制
本文来自互联网或AI生成,不代表软件指南立场。本站不负任何法律责任。