Filter 快速开始 异步Servlet 异步请求 AsyncContext 异步线程 异步派发 过滤器拦截
【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 异步线程 异步派发 过滤器拦截的更多相关文章
- Servlet 3特性:异步Servlet
解异步Servlet之前,让我们试着理解为什么需要它.假设我们有一个Servlet需要很多的时间来处理,类似下面的内容: LongRunningServlet.java package com.jou ...
- 使用tomcat7创建异步servlet
该篇文章翻译自:http://developerlife.com/tutorials/?p=1437 一.简介 Servlet API 3.0 之前,需要使用类似Comet的方式来实现创建异步的Ser ...
- 异步Servlet的理解与实践
AsyncContext理解 Servlet 3.0(JSR315)定义了Servlet/Filter的异步特性规范. 怎么理解"异步Servlet/Filter"及其使用情景? ...
- 异步Servlet和异步过虑器
异步处理功能可以节约容器线程.此功能的作用是释放正在等待完成的线程,是该线程能够被另一请求所使用. 要编写支持异步处理的 Servlet 或者过虑器,需要设置 asyncSupported 属性为 t ...
- 关于servlet3.0中的异步servlet
刚看了一下维基百科上的介绍,servlet3.0是2009年随着JavaEE6.0发布的: 到现在已经有六七年的时间了,在我第一次接触java的时候(2011年),servlet3.0就已经出现很久了 ...
- WebFlux01 webflux概念、异步servlet、WebFlux意义
1 概念 待更新...... 2 异步servlet 2.1 同步servlet servlet容器(如tomcat)里面,每处理一个请求会占用一个线程,同步servlet里面,业务代码处理多久,se ...
- 异步servlet的原理探究
异步servlet是servlet3.0开始支持的,对于单次访问来讲,同步的servlet相比异步的servlet在响应时长上并不会带来变化(这也是常见的误区之一),但对于高并发的服务而言异步serv ...
- Spring Boot异步发送邮件和请求拦截器配置
用户登录流程图: 在spring拦截器中进行鉴权操作: 控制器的拦截: import com.mooc.house.common.model.User; import org.springframew ...
- 使用HttpClient来异步发送POST请求并解析GZIP回应
.NET 4.5(C#): 使用HttpClient来异步发送POST请求并解析GZIP回应 在新的C# 5.0和.NET 4.5环境下,微软为C#加入了async/await,同时还加入新的Syst ...
随机推荐
- [CQOI2017]小Q的表格(数论+分块)
题目描述 小Q是个程序员. 作为一个年轻的程序员,小Q总是被老C欺负,老C经常把一些麻烦的任务交给小Q来处理.每当小Q不知道如何解决时,就只好向你求助. 为了完成任务,小Q需要列一个表格,表格有无穷多 ...
- Wannafly挑战赛29-A御坂美琴 (dfs+map)
链接:https://ac.nowcoder.com/acm/contest/271/A来源:牛客网 御坂美琴 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言 ...
- Manjaro下Steam无法启动
问题描述 直接在桌面环境运行Steam,不会出现任何反应,甚至没有闪过一个对话框. 在终端中运行Sterm,出现以下提示 Repairing installation, linking /home/z ...
- Vue--的src文件
1.assest: 图片等等...... 2.components: 组件 3.App.vue: 根组件,三个部分:模板.行为(处理逻辑).样式: 模板: 只能有一个根标签: <HelloWor ...
- P3378 堆の模板
如果不是可并堆/带修堆/卡常题,一般都用优先队列实现. 很多O(nlogn)过不了的题都可以用蚯蚓的套路来实现!!! 优先队列带修用延迟删除法. 堆,可以简单的用优先队列来实现,也可以自己手打. #i ...
- luogu2643 聪聪可可
题目链接 题意 其实转化之后的题意就是求出树上有多少条路径长度是3的倍数.求答案的时候只要将这个数字除以总路径数量就行了. 思路 考虑点分治.对于当前子树,分别求出出树中每个点到根的路径长度对\(3\ ...
- 打印慢sql的日志
- function call操作符(operator()) 仿函数(functor)
主要是需要某种特殊的东西来代表一整组操作 代表一整组操作的当然是函数,过去通过函数指针实现 所以STL算法的特殊版本所接受的所谓条件或策略或一整组操作都以仿函数的形式呈现 #include <i ...
- JS引用类型
a,b都是引用类型,它们实际上指向同一个内存空间,同呼吸共命运
- 网络流n题
近日好不容易在自救之路写完暑训遗留下来的网络流8题,在此回顾一下. Going Home POJ - 2195 题意:m要去H,一个H只能容纳一个m,一步一块钱,问最小花费. 思路:最小费用最大流的板 ...