Spring boot SpringRestController 6并行执行?
我正在开发一个SpringBoot应用程序。在压力测试期间,应用程序根据并行执行显示出一些奇怪的行为。好吧,不应该有一些并行执行 为了测试此行为,我创建了此RestController: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
@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个选项卡完成一次
现在我的问题是:
@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
第三次测试 使用两个不同的客户端