异步Servlet的理解与实践
AsyncContext理解
Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范.
怎么理解"异步Servlet/Filter"及其使用情景?
Servlet3.0以前
流程:
容器初始化ServletRequest与ServletResponse对象.
容器调用Servlet实例的service(ServletRequest, ServletResponse)执行业务逻辑.
容器Commit ServletResponse, 将响应结果写回客户端并关闭连接.
- Servlet接口定义
public interface Servlet {
public void init(ServletConfig config) throws ServletException;
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException;
public void destroy(); public ServletConfig getServletConfig();
public String getServletInfo();
}
- Filter接口定义
public interface Filter{
public void init(FilterConfig filterConfig) throws ServletException; }
局限
- 执行完流程(2)后立即Commit ServletResponse, 将响应结果回写给客户端.
- 局限(1)导致请求的所有业务逻辑都必须在service()方法内同步执行.
- 局限(2)导致容器的控制线程耗用严重, 特别是长连接或者阻塞等待(DB,IO,Net)的情景.
看到这里, 是不是有点明白了!
Servlet 3.0前, Service容器调用Servlet.service()方法后就会Commit与销毁ServletResponse, 这导致所有业务逻辑都必须在service()内处理, 不管理是耗时还是不耗时的, 控制线程必须等待处理完成才能"抽身"服务新的请求.
Servlet 3.0 规范提供AsyncContext设施实现ServletResponse的delay commit.
AsyncContext原理
通过ServletRequest.startAsync()通知Servlet容器delay ServletResponse的committal, 并返回AsyncContext对象供其他线程在service()方法结束后使用.
AsyncContext套路
设置asyncSupported=true.
- 在<servlet>或<filter>内使用<async-supported>标签
- 在@WebServlet或@WebFilter内使用asyncSupported属性
调用ServletRequest.startAsyc()通知容器delay ServletResponse的committal, 并返回AsyncContext对象.
调用AsycContext.setTimeout()设置超时; 调用AsyncContext.addListener()添加监听器,设置start/timeout/error/complete的回调方法.
将AsyncContext对象交给工作线程处理.
- 自定义线程池: ThreadPoolExecutor
- 容器线程池: AsyncContext.start()
控制线程继续服务其他请求.
工作线程完成处理, 响应结果回写客户端.
- 正常完成: 手工调用AsyncContext.complete()
- 处理超时或发生错误, 自动调用AsyncContext.complete().
只有AsyncContext.complete(), ServletResponse才会提交, 响应结果才会回写客户端. - 分发其他: 调用dispatch分发其他Servlet处理.
最佳实践: 慎重AsyncContext.setTimeout(0)
AsyncContext相关的API:
ServletRequest:
- ServletRequest.isAsyncSupported()
- ServletRequest.isAsyncStarted()
- ServletRequest.startAsync(...) #多个
- ServletRequest.getAsyncContext()
AsyncContext:
可分成下述几类
- AsyncContext.getRequest()/getResponse()/hasOriginalRequestAndResponse()
- AsyncContext.setTimeout()/getTimeout()
- AsyncContext.addListener(...)/createListener()
- AsyncContext.complete()/dispatch(...)
- AsyncContext.start()
异步Servlet的理解与实践的更多相关文章
- Java网络编程中异步编程的理解
目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...
- Atitit.异步编程技术原理与实践attilax总结
Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...
- Servlet 3特性:异步Servlet
解异步Servlet之前,让我们试着理解为什么需要它.假设我们有一个Servlet需要很多的时间来处理,类似下面的内容: LongRunningServlet.java package com.jou ...
- 异步servlet的原理探究
异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...
- 使用tomcat7创建异步servlet
该篇文章翻译自:http://developerlife.com/tutorials/?p=1437 一.简介 Servlet API 3.0 之前,需要使用类似Comet的方式来实现创建异步的Ser ...
- tornado异步请求的理解(转)
tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...
- Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截
[web.xml] <filter> <filter-name>normalFilter</filter-name> <filter-class>net ...
- 异步Servlet和异步过虑器
异步处理功能可以节约容器线程.此功能的作用是释放正在等待完成的线程,是该线程能够被另一请求所使用. 要编写支持异步处理的 Servlet 或者过虑器,需要设置 asyncSupported 属性为 t ...
- 关于servlet3.0中的异步servlet
刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...
随机推荐
- 益智小游戏(app)
最好的益智类游戏要基于一定的数学原理. 一笔完成:(拓扑学,哥尼斯堡问题) 哥尼斯堡七桥问题
- Android 节日短信送祝福(功能篇:2-短信历史记录Fragment的编写)
因为用于展示短信记录的是一个ListView,但是为了方便,可以直接继承自ListFragment,就可以免去写ListView对应的布局了,只需要写其item对应的布局即可. item_sended ...
- 跟我学AngularJs:Service、Factory、Provider依赖注入使用与差别
林炳文Evankaka原创作品. 转载请注明出处http://blog.csdn.net/evankaka 本教程使用AngularJs版本号:1.5.3 AngularJ ...
- C++ 中的 const 类型变量
之前总感觉C/C++中有const 限定的变量是个很头痛的问题,一会儿能够变.一会儿不能够变,一会儿把const赋给nonconst,一会儿又把nonconst赋给const,头都被它搞大了.今天刚好 ...
- http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误)
http500:服务器内部错误案例详解(服务器代码语法错误或者逻辑错误) 一.总结 服务器内部错误可能是服务器中代码运行的时候的语法错误或者逻辑错误 二.http500:服务器内部错误案例详解 只是一 ...
- CoreData使用方法二:NSFetchedResultsController实例操作与解说
学习了NSFetchedResultsController.才深深的体会到coredata的牛逼之处.原来Apple公司弄个新技术.不是平白无故的去弄,会给代码执行到来非常大的优点.coredata不 ...
- BZOJ 3631 松鼠的新家 - 树链剖分 / 树上差分
传送门 分析: 树链剖分:x->y,将x到y的路径加一,并将x端点的答案-1,最后统计答案. 树上差分:x->y,x+1,y+1,lca-1,fa[lca]-1,并将x打上标记,最后统计前 ...
- TensorFlow 学习(十二)—— 高级函数
tf.map_fn(fn, elems):接受一个函数对象,然后用该函数对象对集合(elems)中的每一个元素分别处理, def preprocessing_image(image, training ...
- WPF入门(三)->几何图形之不规则图形(PathGeometry) (2)
原文:WPF入门(三)->几何图形之不规则图形(PathGeometry) (2) 上一节我们介绍了PathGeometry中LineSegment是点与点之间绘制的一条直线,那么我们这一节来看 ...
- 谈谈android缓存文件
##内部存储 总是可用的 这里的文件默认是只能被你的app所访问的. 当用户卸载你的app的时候,系统会把internal里面的相关文件都清除干净. Internal是在你想确保不被用户与其他app所 ...