什么时候servlet释放它的线程?

假设没有保留,当一个servlet容器作为一个独立的服务器时,我认为servlet的线程不会被释放,直到整个响应被发送到客户端(比如web浏览器)。 这是一个正确的假设吗?

但是,如果servlet支持像Nginx这样的反向代理,会发生什么? 一旦将响应传递给Nginx,线程是否被释放,或者直到响应被发送到它的最终客户端(比如浏览器)?

更新:让我试试这个更清楚一点。

对于从servlet发送到像nginx这样的代理的响应,仅需要几毫秒(比如2ms)。 但是,它可能需要额外的80ms(或者这样)才能从nginx发送给浏览器。 一旦响应发送给nginx,servlet是否释放线程/stream,或者servlet是否保留它们直到响应被发送到浏览器(即整个80ms)

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

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

问题:一旦将响应传递给Nginx,线程是否被释放,或者直到响应被发送到最终客户端(比如浏览器)为止呢?

Ans:当Nginx处于后台时,Servlet容器的客户端是Nginx。 它不知道实际的远程客户端。 所以,一旦将响应写入Nginx,线程就会被释放。

服务器容器无法向客户端发送响应将触发将由容器处理的异常。 您可以通过try catch(使用close())将写入封装到outputstream或writer中,但不需要容器将管理,包括将线程返回到池中。 问候S

一个servlet没有看到网络。 根据规范处理2个对象:一个请求和一个响应被填充(在HTTP的情况下,这意味着一个HTTPRequest和一个HTTPResponse)。 它将处理请求对象中的请求数据,并写入响应对象中的缓冲区。 一旦这个内容被servlet提交,容器可以做一些后处理(使用过滤器)并将其传送回客户端。

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

请注意,因为servlet没有看到网络,只关心一个请求,所以http连接(keep-alive或close)的状态与servlet的生命周期无关; 几个servlet可以处理在单个连接中流水线化的不同请求。 看到这个问题的相关问题。