Spring boot SpringRestController 6并行执行?

Spring boot SpringRestController 6并行执行?,spring-boot,spring-restcontroller,Spring Boot,Spring Restcontroller,我正在开发一个SpringBoot应用程序。在压力测试期间,应用程序根据并行执行显示出一些奇怪的行为。好吧,不应该有一些并行执行 为了测试此行为,我创建了此RestController: @RestController public class TestController2 { private static int instancecount = 0; @PostConstruct public void con() { System.out.println("instanceco

我正在开发一个SpringBoot应用程序。在压力测试期间,应用程序根据并行执行显示出一些奇怪的行为。好吧,不应该有一些并行执行

为了测试此行为,我创建了此RestController:

@RestController
public class TestController2 {

private static int instancecount = 0;

@PostConstruct
public void con() {
    System.out.println("instancecount: " + ++instancecount);
}

@PreDestroy
public void des() {
    System.out.println("PreDestroy");
}

@RequestMapping(value = { "/", "/**" }, method = RequestMethod.GET)
@ResponseBody
public ResponseEntity<String> entrypoint(@RequestHeader Map<String, String> requestHeaders) {
    System.out.println("PRE!!!!!!!!!!!!!");
    try {
         Thread.sleep(120000);
    } catch (InterruptedException e) {
    }
    System.out.println("POST!!!!!!!!!!!!!!!!!");

    return new ResponseEntity<String>("qwertz", null, HttpStatus.OK);
}

}
@RestController
公共类TestController2{
私有静态int instancecount=0;
@施工后
公屋{
System.out.println(“instancecount:+++instancecount”);
}
@发情前期
公共空间{
系统输出打印(“预销毁”);
}
@RequestMapping(值={”/“,“/**”},方法=RequestMethod.GET)
@应答器
公共响应入口点(@RequestHeader映射requestHeaders){
System.out.println(“PRE!!!!!!!!!!!”;
试一试{
睡眠(120000);
}捕捉(中断异常e){
}
System.out.println(“POST!!!!!!!!!!!!!!!”;
返回新的ResponseEntity(“qwertz”,null,HttpStatus.OK);
}
}
应用程序按照预期进行编译和工作。现在,我同时打开14个选项卡的浏览器

在日志中,我可以看到即时:

PRE

大约15瑞典克朗之后。下一个5: 之前!!!!!!!!!!!!! 之前!!!!!!!!!!!!! 之前!!!!!!!!!!!!! 之前!!!!!!!!!!!!! PRE

2分钟后,第一个完成。另外5个在大约2:15结束

重复此操作,直到每14个选项卡完成一次

现在我的问题是:

  • 为什么会有并行执行
  • 为什么是6
  • 为什么第二个在约15秒后开始
  • 我有点困惑。我不知道我要去哪里找什么

    需要输入

    THX

    在日志中,我可以看到即时:

    PRE

    大约15瑞典克朗之后。下一个5:预!!!!!!!!!!!!! 之前!!!!!!!!!!!!!之前!!!!!!!!!!!!!之前!!!!!!!!!!!!!PRE

    我认为这是浏览器的问题/限制

    当一个请求到达servlet容器(例如Tomcat)时,从池中检索一个线程为其提供服务。这意味着每个请求都有自己的线程,并且在整个生命周期中(即:您发送了响应)都将使用该线程

    这就是为什么我认为这是浏览器强加的限制

    看一看:

    @RestController
    @请求映射(path=“test”)
    公共类测试控制器{
    私有最终记录器log=LoggerFactory.getLogger(this.getClass());
    @GetMapping
    public ResponseEntity handleTest()引发InterruptedException{
    info(“线程{}已启动”,Thread.currentThread().toString());
    睡眠(5000);
    info(“线程{}已完成”,Thread.currentThread().toString());
    返回ResponseEntity.ok(“已执行!!”);
    }
    }
    
    第一次测试

    在浏览器中打开5个选项卡

    这会立即被记录下来

    2019-10-17 09:36:37.514  INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-1,5,main] started
    
    现在,在所有5个请求(5个选项卡)接收到响应后(查看时间-一个接一个地执行一个响应):


    第二次测试

    在浏览器中刷新页面

    继续,打开浏览器,键入URL,按
    ENTER
    ,然后开始按
    CTRL
    +
    R

    我按了四次CTRL+R

    因此将有1+4个请求(第一个请求(使用
    ENTER
    )和随后的4个请求(使用
    CTRL
    +
    R

    我可以看到所有5个线程开始并行运行:

    2019-10-17 09:46:30.149  INFO 10324 --- [nio-8083-exec-9] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-9,5,main] started
    2019-10-17 09:46:30.471  INFO 10324 --- [io-8083-exec-28] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-28,5,main] started
    2019-10-17 09:46:30.713  INFO 10324 --- [io-8083-exec-29] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-29,5,main] started
    2019-10-17 09:46:30.981  INFO 10324 --- [io-8083-exec-10] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-10,5,main] started
    2019-10-17 09:46:31.244  INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-1,5,main] started
    

    第三次测试

    使用两个不同的客户端

    继续,试试Postman(或任何其他http客户端)和您的浏览器

    使用浏览器
    ALT
    +
    TAB
    发送请求,并使用邮递员发送请求

    我可以看到这两个线程开始并行运行(第一个请求来自浏览器,第二个请求是使用Postman发出的):

    通过查看这些测试,我确信这是浏览器强加的限制

    在日志中,我可以看到即时:

    PRE

    大约15瑞典克朗之后。下一个5:预!!!!!!!!!!!!! 之前!!!!!!!!!!!!!之前!!!!!!!!!!!!!之前!!!!!!!!!!!!!PRE

    我认为这是浏览器的问题/限制

    当一个请求到达servlet容器(例如Tomcat)时,从池中检索一个线程为其提供服务。这意味着每个请求都有自己的线程,并且在整个生命周期中(即:您发送了响应)都将使用该线程

    这就是为什么我认为这是浏览器强加的限制

    看一看:

    @RestController
    @请求映射(path=“test”)
    公共类测试控制器{
    私有最终记录器log=LoggerFactory.getLogger(this.getClass());
    @GetMapping
    public ResponseEntity handleTest()引发InterruptedException{
    info(“线程{}已启动”,Thread.currentThread().toString());
    睡眠(5000);
    info(“线程{}已完成”,Thread.currentThread().toString());
    返回ResponseEntity.ok(“已执行!!”);
    }
    }
    
    第一次测试

    在浏览器中打开5个选项卡

    这会立即被记录下来

    2019-10-17 09:36:37.514  INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-1,5,main] started
    
    现在,在所有5个请求(5个选项卡)接收到响应后(查看时间-一个接一个地执行一个响应):


    第二次测试

    在浏览器中刷新页面

    继续,打开浏览器,键入URL,按
    ENTER
    ,然后开始按
    CTRL
    +
    R

    我按了四次CTRL+R

    因此将有1+4个请求(第一个请求(使用
    ENTER
    )和随后的4个请求(使用
    CTRL
    +
    R

    我可以看到所有5个线程开始并行运行:

    2019-10-17 09:46:30.149  INFO 10324 --- [nio-8083-exec-9] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-9,5,main] started
    2019-10-17 09:46:30.471  INFO 10324 --- [io-8083-exec-28] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-28,5,main] started
    2019-10-17 09:46:30.713  INFO 10324 --- [io-8083-exec-29] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-29,5,main] started
    2019-10-17 09:46:30.981  INFO 10324 --- [io-8083-exec-10] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-10,5,main] started
    2019-10-17 09:46:31.244  INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController        : Thread Thread[http-nio-8083-exec-1,5,main] started
    

    第三次测试

    使用两个不同的客户端