[Servlet扫盲]---(4)service处理流程相关问题

声明:

Author:赵志乾

Date:2017-12-31

Declaration:All Right Reserved!!!


1、多线程问题

    容器可以并发发送多个请求到Servlet实例的service方法,其线程安全性需由Servlet开发人员保证。一种简化方案就是实现SingleThreadModel接口,从而由容器来保证service方法在某一时刻仅能被一个线程访问,但在实际开发中并不推荐这种方案。另外一种方案就是由容器维护一个Servlet实例池,来实现请求的并发处理。

    注:除上述两种方法外,还可以对service方法,或者接受service派发请求的方法使用synchronized关键字,以保证处理请求串行化,但这种处理方式会影响系统的性能,实际开发过程中并不推荐。

2、处理异常

    Servlet在处理请求过程中通过抛出异常的方式来表明处理出错,此时容器需要根据抛出的异常采取适当的措施来处理请求。

    如果Servlet抛出UnavailableException异常,则表明当前Servlet无法处理请求,这一失效性可能是暂时的,也可能是永久性的。如果其为永久性失效,则容器需保证能够调用实例的destroy方法将其移除,并且容器会为所拒绝的请求返回一个404错误。如果其为暂时性失效,则容器依然会为其派发请求,并返回503错误。

    注:有时候,容器是不区分暂时性和永久性失效的。这取决于容器的具体实现。

3、异步处理

    某些场景下,Servlet需要等待一些资源或事件来生成响应,比如一个JDBC连接、一个远程Web服务等等。如果直接在Servlet中进行等待,便会因其长时间占用受限资源而降低容器的性能。自Servlet3.0开始,规范中引入了请求的异步处理能力,即让线程先返回容器,从而能够执行更多的任务。典型的异步事件处理流程如下:

   (1)容器收到客户端发来的请求,将其经过一系列过滤器处理后派发给Servlet;

   (2)Servlet会依据请求体确定请求类型。当其需要获取一些耗时的资源或数据时,Servlet会在无响应的条件下直接返回。

   (3)当请求的资源可用时,会继续处理上述未完成的流程,即生成响应。


参考资料:Servlet3.1规范




猜你喜欢

转载自blog.csdn.net/zhaoyaxuan001/article/details/78942035