在我的 Spring Boot 2.1.6 项目(基于 Tomcat)中,我有一个休息 Controller 。我向它添加了一个默认构造函数来打印一些东西。我认为在基于 Tomcat 的服务器中,每个请求都是在单独的线程中处理的。所以我希望每个请求都能触发一个新的 Controller 对象,并因此从构造函数中获得新的打印结果。但是,我测试了向其余 Controller 发送 30 个请求,但我只看到打印了一次。据我所知,其余 Controller 在一个线程中处理所有这些请求。
我的问题是,是否确实在单个线程中处理了多个请求,或者可能存在某个请求阈值,在该阈值上另一个线程将被打开?我正在使用默认的 Spring Boot 配置,也许这是在配置中的某处控制的?
这是我的 Controller 的代码:
@RestController
public class TrackingEventController {
public TrackingEventController() {
System.out.println("from TrackingEventController");
}
@RequestMapping(method=GET, path=trackingEventPath)
public ResponseEntity<Object> handleTrackingEvent(
@RequestParam(name = Routes.event) String event,
@RequestParam(name = Routes.pubId) String pubId,
@RequestParam(name = Routes.advId) String advId) {
return new ResponseEntity<>(null, new HttpHeaders(), HttpStatus.OK);
}
}
最佳答案
您正在混合两个正交概念:
- 一个线程
- 一个 Controller 实例
单个线程可以创建和/或使用一个或多个 Controller 实例。
多个线程也可以创建和/或使用一个或多个 Controller 实例。
两者无关。
它的实际工作原理是
- 默认情况下,Spring bean 是单例的,因此 Spring 创建了 Controller 的单个实例
- servlet 容器使用线程池。
- 每次有请求进来,都会从池中选出一个线程,由这个线程处理请求。如果请求映射到您的 Controller ,则该线程将执行唯一 Controller 实例的适当方法。
如果您想知道哪个线程正在处理当前请求,请将其添加到您的 Controller 方法中:
System.out.println(Thread.currentThread().getName());
关于java - 在达到特定请求阈值之前,是否由 Spring Boot 中的单个线程处理多个请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57323758/