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 ...
随机推荐
- angularjs优化方略
angular优化方略,闲的没事想重构的人来瞅瞅. 1.减少$watch 减少$watch,减少$watch,减少$watch.不仅仅是$watch监听,还有ng-model,别闲的没事就加个ng-m ...
- Educational Codeforces Round 46 C - Covered Points Count
C - Covered Points Count emmm 好像是先离散化一下 注意 R需要+1 这样可以确定端点 emmm 扫描线?瞎搞一下? #include<bits/stdc++.h&g ...
- ACM-ICPC 2015 BeiJing
比赛连接:ACM-ICPC 2015 BeiJing 本次比赛只写了 A G 然后 I题随后补 A 有一个正方形土地,上面有若干块绿洲.让你以x0为界限划一条竖线,要求左边绿洲面积>=右 ...
- spring data jpa 分页查询
https://www.cnblogs.com/hdwang/p/7843405.html spring data jpa 分页查询 法一(本地sql查询,注意表名啥的都用数据库中的名称,适用于特 ...
- 内部git常用总结
上库git常用命令总结 http://3ms.huawei.com/hi/group/1531/wiki_4955279.html?for_statistic_from=all_group_wik ...
- Ubuntu下添加Samba用户名与密码
参考: ubuntu下的Samba配置:使每个用户可以用自己的用户名和密码登录自己的home目录 增加samba用户提示Failed to add entry for user Ubuntu可以直接在 ...
- 漫谈php框架之中间件
市面上常见的php框架有很多,最近因为有技术需求,所以对常见的php框架的中间件进行了一些了解.各个框架尽管在目标上对php框架的定义大同小异,但是在实现方式上却各有不同,且看下文: 定义 首先什么是 ...
- CSS——nth-child()
nth-child()选择器:CSS3新属性 用法:p:nth-child(2) 选择p标签的父元素 的第二个子元素,并且这个子元素必须是p才起作用 有点绕,有点无厘头,举个栗子: <!DOCT ...
- django补充
通过表名获取app的name models.UserInfo._meta.app_label >>> from repository import models >>&g ...
- Java 中的悲观锁和乐观锁的实现
一.定义 1.悲观锁:即很悲观,每次拿数据的时候都觉得数据会被人更改,所以拿数据的时候就把这条记录锁掉,这样别人就没法改这条数据了,一直到你的锁释放. 2.乐观锁:即很乐观,查询数据的时候总觉得不会有 ...