Spring RestController 6 并行执行?
Spring RestController 6 parallel execution?
我正在开发一个 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);
}
}
应用程序按预期编译和工作。现在我同时打开14个标签页的浏览器
在日志中我可以看到即时:
前!!!!!!!!!!!!!!
大约 15 秒后。接下来的 5 个:
前!!!!!!!!!!!!!
前!!!!!!!!!!!!!
前!!!!!!!!!!!!!
前!!!!!!!!!!!!!
前!!!!!!!!!!!!!
2 分钟后,第一个结束。其他 5 个在 ~2:15 完成。
重复此过程,直到完成每 14 个选项卡。
现在我的问题是:
- 为什么会有并行执行?
- 为什么是 6 个?
- 为什么第二个在 ~15 秒后开始?
我有点困惑。我不知道该去哪里找什么?
需要输入!
谢谢
In the log i can see instant:
PRE!!!!!!!!!!!!!
after approximately 15 sek. the next 5: PRE!!!!!!!!!!!!!
PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!!
我认为这是浏览器的问题/限制。
当请求到达 servlet 容器时(例如 Tomcat),将从池中检索一个线程来为其提供服务。这意味着每个请求都有自己的线程,并且它将在整个生命周期内与该线程一起工作(即:您发送了一个响应)。
这就是为什么我认为这是浏览器强加的限制。
看看:
@RestController
@RequestMapping(path = "test")
public class TestController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@GetMapping
public ResponseEntity<Object> handleTest() throws InterruptedException {
log.info("Thread {} started", Thread.currentThread().toString());
Thread.sleep(5000);
log.info("Thread {} finished", Thread.currentThread().toString());
return ResponseEntity.ok("EXECUTED!!");
}
}
初试
在浏览器中打开了 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个tabs)都收到响应(看时间-一个接一个执行):
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
2019-10-17 09:36:42.515 INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-1,5,main] finished
2019-10-17 09:36:42.551 INFO 10324 --- [nio-8083-exec-2] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-2,5,main] started
2019-10-17 09:36:47.551 INFO 10324 --- [nio-8083-exec-2] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-2,5,main] finished
2019-10-17 09:36:47.559 INFO 10324 --- [nio-8083-exec-4] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-4,5,main] started
2019-10-17 09:36:52.560 INFO 10324 --- [nio-8083-exec-4] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-4,5,main] finished
2019-10-17 09:36:52.571 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] started
2019-10-17 09:36:57.572 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] finished
2019-10-17 09:36:57.582 INFO 10324 --- [nio-8083-exec-6] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-6,5,main] started
2019-10-17 09:37:02.584 INFO 10324 --- [nio-8083-exec-6] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-6,5,main] finished
第二次测试
正在浏览器中刷新页面
继续,打开浏览器,输入 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发送请求。
我可以看到两个线程并行启动 运行(第一个请求来自浏览器,第二个请求是使用 Postman 发出的):
2019-10-17 09:50:31.663 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] started
2019-10-17 09:50:32.587 INFO 10324 --- [nio-8083-exec-9] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-9,5,main] started
通过查看这些测试,我确信这是浏览器强加的限制。
我正在开发一个 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);
}
}
应用程序按预期编译和工作。现在我同时打开14个标签页的浏览器
在日志中我可以看到即时:
前!!!!!!!!!!!!!!
大约 15 秒后。接下来的 5 个: 前!!!!!!!!!!!!! 前!!!!!!!!!!!!! 前!!!!!!!!!!!!! 前!!!!!!!!!!!!! 前!!!!!!!!!!!!!
2 分钟后,第一个结束。其他 5 个在 ~2:15 完成。
重复此过程,直到完成每 14 个选项卡。
现在我的问题是:
- 为什么会有并行执行?
- 为什么是 6 个?
- 为什么第二个在 ~15 秒后开始?
我有点困惑。我不知道该去哪里找什么?
需要输入!
谢谢
In the log i can see instant:
PRE!!!!!!!!!!!!!
after approximately 15 sek. the next 5: PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!! PRE!!!!!!!!!!!!!
我认为这是浏览器的问题/限制。
当请求到达 servlet 容器时(例如 Tomcat),将从池中检索一个线程来为其提供服务。这意味着每个请求都有自己的线程,并且它将在整个生命周期内与该线程一起工作(即:您发送了一个响应)。
这就是为什么我认为这是浏览器强加的限制。
看看:
@RestController
@RequestMapping(path = "test")
public class TestController {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@GetMapping
public ResponseEntity<Object> handleTest() throws InterruptedException {
log.info("Thread {} started", Thread.currentThread().toString());
Thread.sleep(5000);
log.info("Thread {} finished", Thread.currentThread().toString());
return ResponseEntity.ok("EXECUTED!!");
}
}
初试
在浏览器中打开了 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个tabs)都收到响应(看时间-一个接一个执行):
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
2019-10-17 09:36:42.515 INFO 10324 --- [nio-8083-exec-1] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-1,5,main] finished
2019-10-17 09:36:42.551 INFO 10324 --- [nio-8083-exec-2] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-2,5,main] started
2019-10-17 09:36:47.551 INFO 10324 --- [nio-8083-exec-2] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-2,5,main] finished
2019-10-17 09:36:47.559 INFO 10324 --- [nio-8083-exec-4] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-4,5,main] started
2019-10-17 09:36:52.560 INFO 10324 --- [nio-8083-exec-4] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-4,5,main] finished
2019-10-17 09:36:52.571 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] started
2019-10-17 09:36:57.572 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] finished
2019-10-17 09:36:57.582 INFO 10324 --- [nio-8083-exec-6] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-6,5,main] started
2019-10-17 09:37:02.584 INFO 10324 --- [nio-8083-exec-6] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-6,5,main] finished
第二次测试
正在浏览器中刷新页面
继续,打开浏览器,输入 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发送请求。
我可以看到两个线程并行启动 运行(第一个请求来自浏览器,第二个请求是使用 Postman 发出的):
2019-10-17 09:50:31.663 INFO 10324 --- [nio-8083-exec-5] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-5,5,main] started
2019-10-17 09:50:32.587 INFO 10324 --- [nio-8083-exec-9] b.c.d.m.controller.TestController : Thread Thread[http-nio-8083-exec-9,5,main] started
通过查看这些测试,我确信这是浏览器强加的限制。