java - Tomcat 线程模型 - 每个请求模型中的线程是否处理与该请求相关的所有工作?

标签 java multithreading tomcat concurrency

我知道 Servlet 容器将使用“每个请求线程”模型,但我的问题是,处理请求的线程是否会执行以下所有步骤?

  1. 从池中获取线程来处理请求,并将http请求和http响应对象传递给Servlet服务方法。
  2. 调用服务/dao/逻辑,由于 I/O 操作是在数据库中完成的,因此可能会涉及延迟。
  3. 返回 Http 响应
  4. 将线程返回容器线程池

我的主要问题是,如果第 2 步的 I/O 操作以某种方式花费大量时间,Servlet 容器是否会耗尽池中的线程?或者容器是否只使用一个线程/多个线程来处理请求,然后将工作委托(delegate)给另一个线程来完成其余的工作?我还听说现在他们正在将模型更改为具有 NIO 操作的线程模型?谢谢。

最佳答案

will the same thread be used for everything ?

TL;DR -

一旦 Servlet 容器 (Catalina) 为每个请求启动线程,该线程将在请求-响应周期完成后立即释放/退出(即相应的 HTTP 请求处理程序 Servlet 方法返回)。

如果您的服务(DAO/逻辑/其他)层将阻塞线程,最终阻塞 web 层(doGet()doPost() 等)。 ),浏览器将进入空闲状态,等待响应(时间可以是默认的或已配置的),而 Catalina(Servlet 容器) 将阻塞该线程(其他请求可能会成功到达);

I/O(或者具体的Request-Response)超时要么是默认的(60秒,但取决于Tomcat版本),要么是你自己配置的;

架构的设计,将离散的传入 HTTP 消息委托(delegate)给单独的线程,有一个唯一而简单的目的 - 隔离处理请求-响应周期。

Head First Servlets & JSP :

The Container automatically creates a new Java thread for every servlet request it receives. When the servlet’s done running the HTTP service method for that client’s request, the thread completes (i.e. dies).


更新您的问题

my question is, will the thread handling the request do all the below steps?

TL;DR - 再次

Servlet 对象存在于容器中,容器是一个完全独立的线程。

当 HTTP 消息(在本例中为请求)到达 Servlet 映射的端点时,会发生这种情况:

  1. Servlet 容器创建 HttpServletResponseHttpServletRequest 对象;
  2. 容器为该请求和响应对象分配(创建)一个新线程(重要:为了隔离客户端-服务器通信。 );
  3. 然后容器将这些请求和响应对象传递给 servlet 线程;
  4. 容器然后调用 Servlet API 的 service() 方法并根据传入消息的类型(GETPOST 等) .), 调用相应的方法(doGet(); doPost();等);
  5. 容器不关心您拥有的任何级别或层级的架构 - DAO、存储库、服务、Cherry、Apple 或其他任何架构。它将等待直到相应的 HTTP 请求处理程序方法完成(因此,如果有东西阻止它,容器将阻止该线程);
  6. 当处理方法返回时;线程被释放。

回答您的进一步问题

My main questions is, if somehow the I/O operation on step 2 takes a huge amount of time, will the Servlet container run out of threads from the pool ?

理论上可以;然而,这意味着它应该同时阻塞所有 200 个线程,并且这次(如果保持默认配置)它不会接受任何其他请求(直到某些线程释放)。

然而,这 can be configured with maxThreads attribute您可以选择 Tomcat 中允许的请求处理线程的阈值数量。

Or does the Container use one thread/threads just to handle the request and then delegates the work to another thread to do the rest of the work?

我们已经在上面回答过了。

Also I heard that nowadays they are changing the model to a Threaded Model with NIO operations?

NIO specific configuration并且它可以促进轮询线程,这些线程用于同时处理每个线程的多个连接;但是,这是一个很大且完全不同的话题。如需进一步阅读,请查看 thisthis .

请确保您以后的帖子 are not too broad ,在一个帖子中包含 10 个不同的问题。

关于java - Tomcat 线程模型 - 每个请求模型中的线程是否处理与该请求相关的所有工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64083051/

相关文章:

java - 线程没有控制台输出。线程不起作用?

java - 使用 application.properties 中的值初始化过滤器

spring - 避免在 Tomcat 的 JNDI 数据源中使用明文密码

java - 将 List 中 Objects 的字段设置为相同的值并返回一个列表

使用比较器和内部类进行 Java 排序

multithreading - 关闭申请后的文件复制

java - TomEE 遇到 "a non-application exception",但只在 windows 上,不在 mac 上

java - 剥离xml文档的一些标签

java - 如何根据接收到的参数进行mocking?

multithreading - java.net.ConnectException 消息 :Non HTTP response message: Connection refused in jmeter