11.0 第11章异步处理 11.1概述

第11章异步处理

Servlet 3.0引入了一个新功能:异步处理。本章将介绍此功能,并提供实例阐述如何使用它。

11.1概述

一台机器的内存有限。该Servlet/JSP容器设计者知道这一点,并提供了一些可配置的设置,以确保容器内可以运行托管机器的方法。例如,在Tomcat 7中,处理传入的请求的最大线程数是 200。如果你有一个多处理器的服务器,那么你就可以安全地提高这个数字,但除此之外,建议使用该默认值。
Servlet过滤器占有请求处理线程直到它完成任务。如果任务需要很长时间才能完成,当用户的并发请求数目超过线程数时,容器可能会发生无可用线程的风险。如果发生这种情况,Tomcat会堆叠在内部服务器套接字多余的请求(其他容器行为可能不同)。如果有更多的请求进来,它们将被拒绝,直到有空闲资源来处理它们。

异步处理的作用

异步处理功能可以节约容器线程。你应该将异步处理功能使用在长时间运行的操作上。
异步处理功能的作用是释放正在等待完成的线程,使该线程能够被另一请求所使用。

异步处理的使用场景

请注意,这个异步支持只适合你有一个长时间运行的任务并且要把运行结果通知给用户的情况。如果你只有一个长时间运行的任务,但用户并不需要知道处理结果,那么你可以提交一个RunnableExecutor(执行器)然后就可以返回了。

例如,如果你需要生成报告,报告生成需要一定的时间,当它生成完毕时,需要通过邮件发送这个报告,这时servlet异步处理功能不是最佳的解决方案。
相反地,如果你需要生成一个报告,并在报告生成完毕时显示给用户,这时异步处理可能就是你所要的解决方案。