springboot项目,controller多线程处理同一个request时,request.getParameter(),有时获取不到请求参数

再一次前台调用后台查询多个表,获取结果的过程中,我在controller里面开启线程池跑,同事查询多个表。每个线程run方法里面使用同一个request,然后通过request.getParameter()获取入参。多次查询总有那么1,2个线程拿不到参数,跑出空指针异常。我把代码排查到如下类似代码,可以复现问题。使用postman模拟请求http://localhost:8081/test?aaa=aaa,多次发送请求,后台不定时会有空指针异常。

 

springboot项目,controller多线程处理同一个request时,request.getParameter(),有时获取不到请求参数_第1张图片

问题原因追踪:我刚开始怀疑是tomcat的原因,也尝试看了request.getparameter()的源码,如下,paramHashValues的类型是LinkedHashMap,这个类是链表hashmap,它的get方法是线程安全的,且调试过程中paramHashValues分明有值,但是代码还是会调到else里面,很费解。

springboot项目,controller多线程处理同一个request时,request.getParameter(),有时获取不到请求参数_第2张图片

然后我在本地另一个项目里面复现此问题,并没有复现。我认真比对了2个项目的配置文件,发现是pom里面依赖spring boot的版本引起的,spring boot 的不同版本会使用不同版本的tomcat-core,tomcat-core具体处理getParameter()。

问题pom



    4.0.0

    com.kpi
    AutoTest
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent

        2.1.2.RELEASE
         
    

    
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            
        
        
            org.springframework.boot
            spring-boot-starter-tomcat
            provided
        
        
            org.apache.tomcat
            tomcat-servlet-api
            7.0.42
            provided
        
        
            org.apache.httpcomponents
            httpclient
            4.5.2
        
        
            org.springframework.boot
            spring-boot-starter-redis
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
            com.google.guava
            guava
            27.0.1-jre
        
        
            com.alibaba
            fastjson
            1.2.54
            test
        
        
            com.alibaba
            fastjson
            1.2.54
            compile
        
        
            mysql
            mysql-connector-java
            8.0.11
        
        
            org.apache.pdfbox
            pdfbox
            2.0.15
        
        
            org.apache.pdfbox
            fontbox
            2.0.15
        
        
            com.amazonaws
            aws-java-sdk
            1.11.547
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.1.1
        
        
            org.junit.jupiter
            junit-jupiter-api
            RELEASE
            compile
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

没问题的pom



    4.0.0

    com.kpi
    AutoTest
    1.0-SNAPSHOT

    
        org.springframework.boot
        spring-boot-starter-parent
        1.3.2.RELEASE
       
         
    

    
        UTF-8
        1.8
    

    
        
            org.springframework.boot
            spring-boot-starter
        

        
            org.springframework.boot
            spring-boot-starter-test
            test
        

        
            org.springframework.boot
            spring-boot-starter-web
            
                
                    org.springframework.boot
                    spring-boot-starter-tomcat
                
            
        
        
            org.springframework.boot
            spring-boot-starter-tomcat
            provided
        
        
            org.apache.tomcat
            tomcat-servlet-api
            7.0.42
            provided
        
        
            org.apache.httpcomponents
            httpclient
            4.5.2
        
        
            org.springframework.boot
            spring-boot-starter-redis
        
        
            org.springframework.boot
            spring-boot-starter-thymeleaf
        
        
            com.google.guava
            guava
            27.0.1-jre
        
        
            com.alibaba
            fastjson
            1.2.54
            test
        
        
            com.alibaba
            fastjson
            1.2.54
            compile
        
        
            mysql
            mysql-connector-java
            8.0.11
        
        
            org.apache.pdfbox
            pdfbox
            2.0.15
        
        
            org.apache.pdfbox
            fontbox
            2.0.15
        
        
            com.amazonaws
            aws-java-sdk
            1.11.547
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
            1.1.1
        
        
            org.junit.jupiter
            junit-jupiter-api
            RELEASE
            compile
        

    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
            
        
    

如果你们要复现问题的话可以使用问题pom,然后写一个controller,仿照图片的写法。

问题解决:1,更换spring boot 的版本(已验证)

2.可以更换spring boot使用tomcat的版本(未验证)

3.代码里面加入锁(推荐)

springboot项目,controller多线程处理同一个request时,request.getParameter(),有时获取不到请求参数_第3张图片

 

你可能感兴趣的:(spring,boot)