假设没有保持活动,当servlet容器充当独立服务器时,我假设在将整个响应发送到客户端(比如Web浏览器)之前不会释放servlet的线程。这是正确的假设吗?
但是如果servlet在像Nginx这样的反向代理之后会发生什么呢?一旦响应被传递给Nginx,线程是否被释放,或者它是否被保留,直到响应被发送到其最终客户端(比如浏览器)?
更新:让我试着让这一点更清楚。
将响应从servlet发送到代理(如nginx)只需要几毫秒(比如说2ms)。但是,它可能需要额外的80毫秒(左右)才能将最终响应从nginx发送到浏览器。一旦响应发送到nginx,servlet是否释放线程/流,或者servlet是否保留它们直到响应被发送到浏览器(即整个80ms)
答案 0 :(得分:2)
问题:我认为在将整个响应发送到客户端(比如Web浏览器)之前,servlet的线程不会被释放。这是正确的假设吗?
答:不,这不对。 Servlet容器只会将内容写入套接字并返回。无法保证从write()方法返回将确保响应已到达客户端。
问题:一旦将响应传递给Nginx,线程是否会被释放,或者在响应被发送到最终客户端(比如浏览器)之前一直保持线程?
Ans:当Nginx落后时,Servlet容器的客户端就是Nginx。它不知道实际的远程客户端。因此,一旦将响应写入Nginx,线程就会被释放。
答案 1 :(得分:1)
无法向客户端发送响应的服务器容器将触发将由容器处理的异常。您可以通过try catch finally(使用close())将写入包含在outputstream或writer中,但是您不需要,容器将进行管理,包括将线程返回到池中。 问候 小号
答案 2 :(得分:1)
servlet看不到网络。根据{{3}}处理2个对象:要填写的请求和响应(在HTTP的情况下,这意味着HTTPRequest和HTTPResponse)。它应处理请求对象中的请求数据,并写入响应对象中的缓冲区。一旦该内容由servlet 提交,容器可以进行一些后处理(使用过滤器)并将其传回客户端。
一旦对请求处理方法的调用完成,servlet线程就会自然地返回到池中(如果该方法需要进一步工作,可能会在将有效负载发送回客户端之后发生。
请注意,因为servlet没有看到网络而只关心单个请求,所以http连接的状态(keep-alive或close)与servlet的生命周期无关;几个servlet可以处理在单个连接中流水线化的不同请求。有关相关问题,请参阅此specifications。