【web.xml】

<filter>
<filter-name>normalFilter</filter-name>
<filter-class>net.mypla.controller.filter.AnyRequestFilter</filter-class>
<async-supported>true</async-supported> <!--请求启动AsyncContext必要声明-->
</filter> <filter-mapping>
<filter-name>normalFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher><!--只拦截普通请求-->
</filter-mapping> <filter>
<filter-name>forwardFilter</filter-name>
<filter-class>net.mypla.controller.filter.AnyRequestFilter</filter-class>
<async-supported>true</async-supported>
</filter> <filter-mapping>
<filter-name>forwardFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher><!--只拦截转发请求-->
</filter-mapping> <filter>
<filter-name>asyncFilter</filter-name>
<filter-class>net.mypla.controller.filter.AnyRequestFilter</filter-class>
<async-supported>true</async-supported>
</filter> <filter-mapping>
<filter-name>asyncFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>ASYNC</dispatcher><!--拦截由AsyncContext派发的请求-->
</filter-mapping> 【AnyRequestFilter】
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Entering " + this.name + ".doFilter().");
filterChain.doFilter(new HttpServletRequestWrapper((HttpServletRequest) req), new HttpServletResponseWrapper((HttpServletResponse) resp));
//真正处理async请求
if (req.isAsyncSupported() && req.isAsyncStarted()) {
AsyncContext context = req.getAsyncContext();
System.out.println("Leaving " + this.name + ".doFilter(),async" +
"context holds wrapped req/resp = " +
!context.hasOriginalRequestAndResponse());
} else {
System.out.println("leaving " + this.name + ".doFilter().");
}
}
【异步Servlet】异步请求,关键代码
//过滤器有wrap这个动作,我们有收到unwrap的话就是不要wrap
//unwrap 原始参数启动异步 、 没有unwrap就用wrap后的req resp
final AsyncContext context = req.getParameter("unwrap")!=null?
req.startAsync():req.startAsync(req,resp);
//timeout 是请求参数 ?timeout=10000
context.setTimeout(timeout); System.out.println("Starting asynchronous thread.Request ID = "+id+"."); AsyncThread thread = new AsyncThread(id,context);
context.start(thread::doWork);
【异步线程】启动一个线程去处理,最终采用异步派发 而不是直接处理
public void doWork(){
System.out.println("Asynchronous thread started. Request ID = "+
this.id+".");
//当前线程休眠5秒
try {
Thread.sleep(5_000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
  //异步请求
HttpServletRequest request = (HttpServletRequest) this.context.getRequest();
System.out.println("Done sleeping. Request ID = "+this.id+
",URL="+request.getRequestURL()+".");
this.context.dispatch("/WEB-INF/jsp/filter/async.jsp");//异步派发,过滤器拦截。(如果AsyncContext直接处理掉请求,过滤器无法拦截。)
System.out.println("Asynchronous thread completed. Request ID = "+
this.id+".");
}
												

Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截的更多相关文章

  1. Servlet 3特性:异步Servlet

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

  2. 使用tomcat7创建异步servlet

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

  3. 异步Servlet的理解与实践

    AsyncContext理解 Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范. 怎么理解"异步Servlet/Filter"及其使用情景? ...

  4. 异步Servlet和异步过虑器

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

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

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

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

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

  7. 异步servlet的原理探究

    异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...

  8. Spring Boot异步发送邮件和请求拦截器配置

    用户登录流程图: 在spring拦截器中进行鉴权操作: 控制器的拦截: import com.mooc.house.common.model.User; import org.springframew ...

  9. 使用HttpClient来异步发送POST请求并解析GZIP回应

    .NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...

随机推荐

  1. lnmp架构搭建实例

    lamp->lnmp nginx survey.netcraft.net 查看各大网站使用的web服务器,使用下面的命令 # curl -I www.sina.com 结论:现在大型网站几乎统一 ...

  2. Jupyter-Notebook 删除指定 kernel

    原来是Python3+C# 查看列表jupyter kernelspec list 删除指定kernel:jupyter kernelspec remove icsharpkernel 删除成功:(刷 ...

  3. LOJ#3023 老C的键盘

    给定树,每条边有个大于号或者小于号,表示两个节点编号的大小关系.问有多少种树满足条件.n <= 100 解:树形DP. 设fij表示以i为根的子树中i是第j小的.转移的时候要乘上两个组合数. # ...

  4. Proxy代理模式

    https://www.cnblogs.com/vincentzh/p/5988145.html https://www.cnblogs.com/wrbxdj/p/5267370.html(不错)

  5. spring+shiro共享session完整小例子

    之前写过一个,只不过那个不单纯,有人跑不通,所以今天整个纯粹的小例子. 要求你有Redis. 源码 GitHub 目录结构 因为这是个例子,仅仅为了体现共享session,所以权限认证部分没有加入处理 ...

  6. 牛客网 2018年东北农业大学春季校赛 L题 wyh的天鹅

    链接:https://www.nowcoder.com/acm/contest/93/L来源:牛客网 时间限制:C/C++ 3秒,其他语言6秒空间限制:C/C++ 262144K,其他语言524288 ...

  7. 解决access 导出 excel 字段截断错误的问题

    解决方法:这个问题通过从EXCEL中导入外部数据,也就是ACCESS数据可以解决. 1.选择导入数据 2.点击选择数据源 选择需要导入的access数据源

  8. gdb带参调试

    第一种方法:为程序传递参数5 root@guo-virtual-machine:~/debug# gdb --args factorial 5 第二种方法:为程序传递参数5 (gdb) run 5 方 ...

  9. (LIS DP) codeVs 1044 拦截导弹

    题目描述 Description 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某 ...

  10. PHP操作cookie

    1.当只有一个参数的时候,默认是删除,响应报文里面设置了一个过去的时间 setcookie('key2'); 2.当有两个参数的时候,是设置cookie setcookie('key','value1 ...