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

迭戈·拉莫斯

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

  1. 从池中获取线程以处理请求,并将http请求和http响应对象传递给Servlet服务方法。
  2. 调用服务/ dao /逻辑,这可能会导致延迟,因为I / O操作是在DB中完成的。
  3. 返回Http响应
  4. 将线程返回到容器线程池

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

乔治·齐克拉里

同一线程将用于所有内容吗?

TL; DR-

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

如果您的服务(DAO /逻辑/其他)层会阻塞线程,最终阻断网络层(doGet()doPost()或等),浏览器将进入空闲状态,等待响应(时间是默认或配置),和卡特琳娜(Servlet的容器)将阻止该线程(其他请求可能会成功到达);

I / O(或者是特定的请求-响应)超时将是默认的(60秒,但这取决于Tomcat版本),或者由您自己配置;

将离散的传入HTTP消息委托给单独的线程的体系结构设计具有唯一而简单的目的-隔离地处理请求-响应周期。

首要的Servlet和JSP

容器会为收到的每个servlet请求自动创建一个新的Java线程。当Servlet完成针对该客户端请求的HTTP服务方法的运行时,线程完成(即死亡)。


更新到您更新的问题

我的问题是,处理请求的线程会执行以下所有步骤吗?

TL; DR-

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

当HTTP消息(在这种情况下为请求)到达Servlet映射的端点时,将发生以下情况:

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

回答您的其他问题

我的主要问题是,如果第2步的I / O操作花费大量时间,Servlet容器会耗尽池中的线程吗?

从理论上讲可以;但是,这意味着它应该同时阻止所有200个线程,并且这一次(如果保留了默认配置)它将不接受任何其他请求(直到某些线程取消分配)。

但是,可以使用maxThreads属性进行配置,您可以选择Tomcat中允许的请求处理线程的阈值数量。

还是容器只使用一个或多个线程来处理请求,然后将工作委托给另一个线程来完成其余工作?

我们已经在上面回答了这个问题。

我还听说如今他们正在将模型更改为具有NIO操作的线程模型?

NIO特定的配置,它可以简化轮询线程,该轮询线程用于同时处理每个线程的多个连接;但是,这是一个很大且完全不同的主题。为了进一步阅读,请看thisthis

请确保您以后的帖子不要太宽泛,在一个帖子中包含10个不同的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章