Spring RestController 6并行执行?

我开发了一个SpringBoot" title="SpringBoot">SpringBoot应用程序。在压力测试期间,应用程序根据并行执行显示了一些奇怪的行为。AFAIK不应该有一些并行执行…

为了测试这种行为,我创建了这个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个选项卡的浏览器。

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

PRE !!!!!!!!!!!!!

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

!!!!!!!!!!!!! PRE !!!!!!!!!!!!!

2分钟后,第一次完成。其他5个在〜2:15结束。

重复此过程,直到每14个选项卡完成。

现在我的问题是:

  1. 为什么会有并行执行?
  2. 为什么是6?
  3. 为什么第二个在约15秒后开始?

我有点困惑。我不知道要去哪里寻找什么?

需要输入!

谢谢

回答:

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

PRE !!!!!!!!!!!!!

大约15瑞典克朗后。下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!!");

}

}

这将立即记录

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个选项卡)收到响应之后(看看时间- ):

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

因此将有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

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

以上是 Spring RestController 6并行执行? 的全部内容, 来源链接: utcz.com/qa/415732.html

回到顶部