AsyncContext理解

Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范.

怎么理解"异步Servlet/Filter"及其使用情景?

Servlet3.0以前

流程:

  1. 容器初始化ServletRequest与ServletResponse对象.

  2. 容器调用Servlet实例的service(ServletRequest, ServletResponse)执行业务逻辑.

  3. 容器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; }

局限

  1. 执行完流程(2)后立即Commit ServletResponse, 将响应结果回写给客户端.
  2. 局限(1)导致请求的所有业务逻辑都必须在service()方法内同步执行.
  3. 局限(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套路

  1. 设置asyncSupported=true.

    • 在<servlet>或<filter>内使用<async-supported>标签
    • 在@WebServlet或@WebFilter内使用asyncSupported属性
  2. 调用ServletRequest.startAsyc()通知容器delay ServletResponse的committal, 并返回AsyncContext对象.

  3. 调用AsycContext.setTimeout()设置超时; 调用AsyncContext.addListener()添加监听器,设置start/timeout/error/complete的回调方法.

  4. 将AsyncContext对象交给工作线程处理.

    • 自定义线程池: ThreadPoolExecutor
    • 容器线程池: AsyncContext.start()
  5. 控制线程继续服务其他请求.

  6. 工作线程完成处理, 响应结果回写客户端.

    • 正常完成: 手工调用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的理解与实践的更多相关文章

  1. Java网络编程中异步编程的理解

    目录 前言 一.异步,同步,阻塞和非阻塞的理解 二.异步编程从用户层面和框架层面不同角度的理解 用户角度的理解 框架角度的理解 三.为什么使用异步 四.理解这些能在实际中的应用 六.困惑 参考文章 前 ...

  2. Atitit.异步编程技术原理与实践attilax总结

    Atitit.异步编程技术原理与实践attilax总结 1. 俩种实现模式 类库方式,以及语言方式,java futuretask ,c# await1 2. 事件(中断)机制1 3. Await 模 ...

  3. Servlet 3特性:异步Servlet

    解异步Servlet之前,让我们试着理解为什么需要它.假设我们有一个Servlet需要很多的时间来处理,类似下面的内容: LongRunningServlet.java package com.jou ...

  4. 使用tomcat7创建异步servlet

    该篇文章翻译自:http://developerlife.com/tutorials/?p=1437 一.简介 Servlet API 3.0 之前,需要使用类似Comet的方式来实现创建异步的Ser ...

  5. tornado异步请求的理解(转)

    tornado异步请求的理解 http://www.kankanews.com/ICkengine/archives/88953.shtml 官网第一段话: Tornado is a Python w ...

  6. Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截

    [web.xml] <filter> <filter-name>normalFilter</filter-name> <filter-class>net ...

  7. 异步Servlet和异步过虑器

    异步处理功能可以节约容器线程.此功能的作用是释放正在等待完成的线程,是该线程能够被另一请求所使用. 要编写支持异步处理的 Servlet 或者过虑器,需要设置 asyncSupported 属性为 t ...

  8. 关于servlet3.0中的异步servlet

    刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...

  9. WebFlux01 webflux概念、异步servlet、WebFlux意义

    1 概念 待更新...... 2 异步servlet 2.1 同步servlet servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,se ...

随机推荐

  1. ThinkPhp 3.2 数据的连贯操作

    ThinkPHP模型基础类提供的连贯操作方法(也有些框架称之为链式操作),可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作. 使用也比较简单, 假如我们现在要查询一个User表 ...

  2. oracle:如何用sql生成日历

    BI分析中,经常需要将事实表与时间维度表关联起来,按年/月/日来逐层展示,常用的做法是创建一张日历表,结构类似如下: create table T_BAS_CALENDAR ( d_year ) no ...

  3. 利用openSSL 生成RSA公钥和密钥

    安装openssl for Windows. 之后开管理员控制台,打开openSSL 我的是 C:\OpenSSL-Win32\bin\openssl.exe 生成1024位的私钥,不指定的话默认20 ...

  4. Android 4.3正式发布:四大新功能一览

    在旧金山举行的新品发布会上,Google正式发布了Android 4.3,代号仍为“Jelly Bean”.此次更新并没有太大改变,只是紧跟4.1.4.2步伐, 新增了低功耗蓝牙.多用户登录等一系列功 ...

  5. ZEDBOARD启动自启配置(加载镜像) 分类: OpenCV ubuntu shell ZedBoard Eye_Detection 2014-11-08 18:53 167人阅读 评论(0) 收藏

    参考:陆书14.2.8 1)备份ramdisk8M.image.gz 2)加载rootfs镜像文件: 3)在镜像目录下建立自己所需文件夹(挂载目录): 我需要的挂载目录有两个: root/qt/ins ...

  6. 图论测试题(一)第一题:longest

    第一题:longest 乌托邦有n个城市,某些城市之间有公路连接.任意两个城市都可以通过公路直接或者间接到达,并且任意两个城市之间有且仅有一条路径(What does this imply? A tr ...

  7. Jdbc访问数据库篇

    一万年太久,只争朝夕 What JDBC 上部 JDBC(Java DataBase Connectivity)Java 数据库连接,主要提供编写 Java 数据库应用程序的 API 支持 java. ...

  8. android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)

    package net.yt.yuncare.widgets; import android.graphics.Bitmap; import android.graphics.Canvas; impo ...

  9. [20171120]bash使用here documents的一个小细节.txt

    [20171120]bash使用here documents的一个小细节.txt --//昨天看bash文档,,发现一些小细节,做一个记录,就是EOF加引号的问题. command <<' ...

  10. leveldb源码分析--BloomFilter

    bloomfilter是leveldb中的一大性能利器,所以为了文章的表现完整性这里新启这么一篇文章.leveldb中的bloomfilter的实现在bloom.cc中,是一个较为简单的实现,所以就不 ...