首页 > 代码库 > 第十三张_异步处理
第十三张_异步处理
13.1、概述
计算机的内存是有限的。Servlet/JSP容器的设计者很清楚这一点,因此他们提供了一些可以进行配置的设置,以确保容器能够在宿主机器中正常运行。例如,在Tomcat7中,处理进来请求的最多线程数量为200。如果是多处理器的服务器,则可以放心地增加线程数量,不过建议你还是尽量使用这个默认值。
Servlet或Filter一直占用着请求处理线程,直到它完成任务。如果完成任务花费了很长时间,并发用户的数量就会超过线程数量,容器将会遇到超出线程的风险。如果发生这种情况,TOmcat就会将超出的请求堆放在一个内部服务器Socket中(其他容器的处理方式可能会有所不同)。如果继续进来更多的请求,它们将会遭到拒绝,直到有资源可以处理请求为止。
异步处理特性可以帮助你节省容器线程。这项特性适用于长时间运行的操作。它的工作是等待任务完成,并释放请求处理线程,以便另一个请求能够使用该线程。注意,异步支持只适用于长时间运行的任务,并且你想让用户知道任务的执行结果。如果只有长时间运行的任务,但用户不需要知道处理的结果,那么则只要提供一个Runnable给Executor,并立即返回。例如,如果需要产生一份报表,并在保镖准备就绪之后通过电子邮件将报表发送出去,那么就不适合使用异步处理特性了。相反,如果需要产生一份报表,并且报表完成之后要展示给用户看,那么就可以使用异步处理。
13.2、编写异步的Servlet和Filter
WebServlet和WebFilter注解类型可以包含新的asyncSupport属性,为了编写能够支持异步处理的Servlet和Filter,asyncSupported属性必须设为true:
@WebServlet(asyncSupported=true...)
@WebFilter(asyncSupported=true...)
另一种在配置文件中配置
<servlet>
<servlet-name>AsyncServlet</servlet-name>
<servlet-class>servlet.MyAsyncServlet</servlet-class>
</servlet>
第十三张_异步处理