异步处理-Servlets(六)

异步处理-Servlets(六),第1张

异步处理-Servlets(六) 概述

Servlet3.0引入了一个新功能,运行使用Servlet处理异步请求。本章将介绍此功能,并提供实例阐述如何使用它。
一台机器的内存有限。Servlet/JSP容器设计者知道这一点,并提供了一些可配置的设置,以确保容器可以正常运行被托管的方法。例如,在Tomcat7中,处理传入的请求的最大线程数是200。如果你有一个多处理器的服务器,那么你就可以安全地提供这个数字,但除此之外,建议使用该默认值。
Servlet或过滤器占用请求处理线程直到它完成任务。如果任务需要很长时间才能完成,当用户的并发请求数目超过线程数时,容器可能会发生无可用线程的风险。如果发生这种情况,Tomcat会堆叠在内部服务器套接字多余的请求(其他容器行为可能不同)。如果有更多的请求进来,他们将被拒绝,直到有空闲资源来处理它们。
异步处理功能可以节约容器线程。你应该将此功能使用在长时间运行的 *** 作上。此功能的作用是释放正在等待完成的线程,使该线程能够被另一请求所使用。
请注意,这个异步支持只适合你有一个长时间运行的任务并且要把运行结果通知给用户。如果你只有一个长期运行任务,但用户并不需要知道处理结果,那么你可以提交一个Runnable给Executor(执行器)并立即返回。例如,如果你需要生成报告(需要一段时间),当他生成完毕时,通过邮件发送这个报告,这时servlet异步处理功能不是最佳的解决方案。相反地,如果你需要生成一个报告,并在报告已经准备好时显示给用户,这时异步处理可能就是你所要的。

编写异步Servlet和过滤器

WebServlet和WebFilter注解类型可能包含新的asyncSupport属性。要编写支持异步处理的Servlet或过滤器,需设置asynSupported属性为true。

@WebServlet(asyncSupported = true ...)
@WebFilter(asyncSupported = true ...)

此外,也可以在部署文件里面指定这个描述符。例如,下面的Servlet配置为支持异步处理:


	AsyncServlet
	servlet.MyAsyncServlet
	true

Servlet或过滤器要支持异步处理,可以通过调用ServletRequest的startAsync方法来启动一个新线程。这里有两个startAsync的重载方法:

AsyncContext startAsync() throws java.lang.IllegalStateException
AsyncContext startAsync(ServletRequest servletReqeust, ServletResponse servletResponse) throws java.lang.IllegalStateException

这两个重载方法都返回一个AsyncContext实例,这个实例提供各种方法并且包含ServletRequest和ServletResponse。第一个重载实例比较简单并且使用方便。由此生成的asynccontext实例将包含原生的ServletRequesst和ServletResponse。第二个允许您将原来的ServletRequest和ServletResponse进行重写封装后传给asyncontext。需要注意的是,你只能传递原生的ServletRequest和ServletResponse或他们的封装到startAsync第二种重载实例。我们已在之前的章节讨论过ServletRequest和ServletResponse的封装。
注意,startAsync重复调用将返回相同的asynccontext。若一个Servlet或过滤器调用startAsync时不支持异步处理,将抛出java.lang.illegalstateexception异常。还请注意,asynccontext的start方法是非阻塞的,所以下一行代码仍将执行,即使还未调用线程启动。

编写异步Servlets

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5684899.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存