Spring Boot子线程如何访问主线程的Request信息?

spring boot子线程如何访问主线程的request信息?

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生成,不代表软件指南立场。本站不负任何法律责任。

如若转载请注明出处:http://www.down96.com/tutorials/3395.html

热心网友热心网友
上一篇 2025-04-11 14:42
下一篇 2025-04-11 14:43

相关推荐

本站[软件指南]所有内容来自互联网投稿或AI智能生成,并不代表软件指南的立场。