3

假设没有保持活动状态,当 servlet 容器充当独立服务器时,我假设 servlet 的线程在整个响应发送到客户端(例如 Web 浏览器)之前不会被释放。这是一个正确的假设吗?

但是如果 servlet 位于像 Nginx 这样的反向代理之后会发生什么?一旦响应被传递到 Nginx,线程是被释放的,还是在响应被发送到它的最终客户端(比如浏览器)之前被保留?

更新:让我试着更清楚一点。

响应从 servlet 发送到像 nginx 这样的代理只需要几毫秒(比如 2 毫秒)。但最终响应从 nginx 发送到浏览器可能需要额外的 80 毫秒(左右)时间。一旦响应发送到 nginx,servlet 是否释放线程/流,或者 servlet 是否保留它们直到响应发送到浏览器(即整个 80 毫秒)

4

3 回答 3

2

问题:我假设 servlet 的线程在整个响应发送到客户端(比如 Web 浏览器)之前不会被释放。这是一个正确的假设吗?

答:不,这是错误的。Servlet 容器只会将内容写入套接字并返回。不保证 write() 方法的返回将确保响应已到达客户端。

问题:线程是在响应传递到 Nginx 后释放,还是在响应发送到最终客户端(例如浏览器)之前保持线程?

Ans:当 Nginx 落后时,Servlet 容器的客户端是 Nginx。它不知道实际的远程客户端。因此,一旦将响应写入 Nginx,线程将被释放。

于 2013-04-02T05:01:49.007 回答
1

服务器容器无法向客户端发送响应将触发将由容器处理的异常。您可以通过 try catch finally(使用 close())将写入包含在输出流或写入器中,但您不需要,容器将进行管理,包括将线程返回到池中。问候小号

于 2013-04-01T21:26:54.227 回答
1

servlet 看不到网络。根据规范处理 2 个对象:一个 Request 和一个 Response 要填写(在 HTTP 的情况下,这意味着一个 HTTPRequest 和一个 HTTPResponse)。它应处理请求对象内的请求数据,并写入响应对象中的缓冲区。一旦 servlet 提交了该内容容器可能会进行一些后处理(使用过滤器)并将其传输回客户端。

一旦对请求处理方法的调用完成,servlet 线程就会自然地返回到池中(如果方法必须做进一步的工作,这可能发生在有效负载被发送回客户端之后。

请注意,由于 servlet 看不到网络并且只关心单个请求,因此 http 连接的状态(保持活动或关闭)与 servlet 生命周期无关;几个 servlet 可以处理在单个连接中流水线化的不同请求。有关相关问题,请参阅此问题

于 2013-04-01T22:13:50.843 回答