java - 在达到特定请求阈值之前,是否由 Spring Boot 中的单个线程处理多个请求?

标签 java spring-boot tomcat

在我的 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);
    }
}

最佳答案

您正在混合两个正交概念:

  1. 一个线程
  2. 一个 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/

相关文章:

java - 如何计算@ManyToMany中的总项目数

java 编码风格 : one annotation with parameters, 还是只有一个注释的多个注释?

java - Matlab java接口(interface): java. io.IOException : The issuer can not be found in the trusted CA list?

java - 在 Spring Security 中使用 UserDetails 实现登录不起作用

java - TypeScript 映射到 Java 映射

java - 如何在tomcat服务器上部署带有mysql数据库的java web应用程序

java - 使用 Guice : Something that isn't covered by any tutorial 进行依赖注入(inject)

java - 如何修复 "Direct notifications and query notifications cannot be requested together"

spring - 如何在使用 Maven 进行集成测试的 war 中包含测试类和配置?

Maven - 在 JUnit 测试之前将 webapp 部署到 tomcat