Home Java javaTutorial How does Spring Boot child thread access request information of the main thread?

How does Spring Boot child thread access request information of the main thread?

Apr 19, 2025 pm 06:03 PM
red

How does Spring Boot child thread access request information of the main thread?

How does Spring Boot child thread safely access main thread request information

In Spring Boot application, the controller layer initiates asynchronous tasks, and when the Service layer uses a new thread to process, it often faces the problem that the child thread cannot access the main thread HttpServletRequest object. This is because HttpServletRequest is bound to the main thread lifecycle and the child thread cannot be accessed directly. This article analyzes this problem and provides a reliable solution.

Problem description:

Use InheritableThreadLocal<httpservletrequest></httpservletrequest> directly InheritableThreadLocal<httpservletrequest></httpservletrequest> Passing HttpServletRequest to the child thread is unreliable because the HttpServletRequest object may have been destroyed after the main thread has processed the request. Even if the delivery is successful, it can cause memory leaks or other problems.

Error demonstration (code snippet):

The following code tries to pass HttpServletRequest using InheritableThreadLocal , but the child thread cannot get the correct user information:

Controller:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@RestController

@RequestMapping("/test")

public class TestController {

 

    private static InheritableThreadLocal<httpservletrequest> requestHolder = new InheritableThreadLocal();

 

    @Autowired

    private TestService testService;

 

    @GetMapping("/check")

    public void check(HttpServletRequest request) {

        String userId = request.getHeader("userId");

        System.out.println("main thread userId: " userId);

        requestHolder.set(request);

        new Thread(() -> testService.doSomething()).start();

        System.out.println("main thread end");

    }

}</httpservletrequest>

Copy after login

Service layer:

1

2

3

4

5

6

7

8

@Service

public class TestService {

    public void doSomething() {

        HttpServletRequest request = requestHolder.get();

        String userId = request != null ? request.getHeader("userId") : "null";

        System.out.println("child thread userId: " userId);

    }

}

Copy after login

Solution:

Avoid passing HttpServletRequest objects directly. The best practice is to extract necessary information (such as userId ) from HttpServletRequest and then store this information in InheritableThreadLocal .

Improved code example:

Controller:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

@RestController

@RequestMapping("/test")

public class TestController {

 

    private static InheritableThreadLocal<string> userIdHolder = new InheritableThreadLocal();

 

    @Autowired

    private TestService testService;

 

    @GetMapping("/check")

    public void check(HttpServletRequest request) {

        String userId = request.getHeader("userId");

        System.out.println("main thread userId: " userId);

        userIdHolder.set(userId);

        new Thread(() -> testService.doSomething()).start();

        System.out.println("main thread end");

    }

}</string>

Copy after login

Service layer:

1

2

3

4

5

6

7

@Service

public class TestService {

    public void doSomething() {

        String userId = userIdHolder.get();

        System.out.println("child thread userId: " userId);

    }

}

Copy after login

This improved version only passes userId , avoiding the life cycle of HttpServletRequest object and ensuring that the child thread can reliably access the required data. According to actual needs, other necessary information can also be stored in InheritableThreadLocal . Remember to clear the data in InheritableThreadLocal in time after use to avoid memory leakage.

The above is the detailed content of How does Spring Boot child thread access request information of the main thread?. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

Hot Topics

Java Tutorial
1653
14
PHP Tutorial
1251
29
C# Tutorial
1224
24
How to configure Lua script execution time in centos redis How to configure Lua script execution time in centos redis Apr 14, 2025 pm 02:12 PM

On CentOS systems, you can limit the execution time of Lua scripts by modifying Redis configuration files or using Redis commands to prevent malicious scripts from consuming too much resources. Method 1: Modify the Redis configuration file and locate the Redis configuration file: The Redis configuration file is usually located in /etc/redis/redis.conf. Edit configuration file: Open the configuration file using a text editor (such as vi or nano): sudovi/etc/redis/redis.conf Set the Lua script execution time limit: Add or modify the following lines in the configuration file to set the maximum execution time of the Lua script (unit: milliseconds)

What steps are required to configure CentOS in HDFS What steps are required to configure CentOS in HDFS Apr 14, 2025 pm 06:42 PM

Building a Hadoop Distributed File System (HDFS) on a CentOS system requires multiple steps. This article provides a brief configuration guide. 1. Prepare to install JDK in the early stage: Install JavaDevelopmentKit (JDK) on all nodes, and the version must be compatible with Hadoop. The installation package can be downloaded from the Oracle official website. Environment variable configuration: Edit /etc/profile file, set Java and Hadoop environment variables, so that the system can find the installation path of JDK and Hadoop. 2. Security configuration: SSH password-free login to generate SSH key: Use the ssh-keygen command on each node

How Debian improves Hadoop data processing speed How Debian improves Hadoop data processing speed Apr 13, 2025 am 11:54 AM

This article discusses how to improve Hadoop data processing efficiency on Debian systems. Optimization strategies cover hardware upgrades, operating system parameter adjustments, Hadoop configuration modifications, and the use of efficient algorithms and tools. 1. Hardware resource strengthening ensures that all nodes have consistent hardware configurations, especially paying attention to CPU, memory and network equipment performance. Choosing high-performance hardware components is essential to improve overall processing speed. 2. Operating system tunes file descriptors and network connections: Modify the /etc/security/limits.conf file to increase the upper limit of file descriptors and network connections allowed to be opened at the same time by the system. JVM parameter adjustment: Adjust in hadoop-env.sh file

Using Dicr/Yii2-Google to integrate Google API in YII2 Using Dicr/Yii2-Google to integrate Google API in YII2 Apr 18, 2025 am 11:54 AM

VprocesserazrabotkiveB-enclosed, Мнепришлостольностьсясзадачейтерациигооглапидляпапакробоглесхетсigootrive. LEAVALLYSUMBALLANCEFRIABLANCEFAUMDOPTOMATIFICATION, ČtookazaLovnetakProsto, Kakaožidal.Posenesko

How to configure slow query log in centos redis How to configure slow query log in centos redis Apr 14, 2025 pm 04:54 PM

Enable Redis slow query logs on CentOS system to improve performance diagnostic efficiency. The following steps will guide you through the configuration: Step 1: Locate and edit the Redis configuration file First, find the Redis configuration file, usually located in /etc/redis/redis.conf. Open the configuration file with the following command: sudovi/etc/redis/redis.conf Step 2: Adjust the slow query log parameters in the configuration file, find and modify the following parameters: #slow query threshold (ms)slowlog-log-slower-than10000#Maximum number of entries for slow query log slowlog-max-len

How to use the Redis cache solution to efficiently realize the requirements of product ranking list? How to use the Redis cache solution to efficiently realize the requirements of product ranking list? Apr 19, 2025 pm 11:36 PM

How does the Redis caching solution realize the requirements of product ranking list? During the development process, we often need to deal with the requirements of rankings, such as displaying a...

What files do you need to modify in HDFS configuration CentOS? What files do you need to modify in HDFS configuration CentOS? Apr 14, 2025 pm 07:27 PM

When configuring Hadoop Distributed File System (HDFS) on CentOS, the following key configuration files need to be modified: core-site.xml: fs.defaultFS: Specifies the default file system address of HDFS, such as hdfs://localhost:9000. hadoop.tmp.dir: Specifies the storage directory for Hadoop temporary files. hadoop.proxyuser.root.hosts and hadoop.proxyuser.ro

Tips for using HDFS file system on CentOS Tips for using HDFS file system on CentOS Apr 14, 2025 pm 07:30 PM

The Installation, Configuration and Optimization Guide for HDFS File System under CentOS System This article will guide you how to install, configure and optimize Hadoop Distributed File System (HDFS) on CentOS System. HDFS installation and configuration Java environment installation: First, make sure that the appropriate Java environment is installed. Edit /etc/profile file, add the following, and replace /usr/lib/java-1.8.0/jdk1.8.0_144 with your actual Java installation path: exportJAVA_HOME=/usr/lib/java-1.8.0/jdk1.8.0_144exportPATH=$J

See all articles