AsyncContext简介
为了支持异步处理,在Servlet 3.0中,在ServletRequest上提供了startAsync()方法: AsyncContext startAsync() throws Java.lang.IllegalStateException; AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse) throws java.lang.IllegalStateException
这两个方法都会返回AsyncContext接口的实现对象,前者会直接利用原有的请求与响应对象来创建AsyncContext,后者可以传入自行创建的请求、响应封装对象。在调用了startAsync()方法取得AsyncContext对象之后,此次请求的响应会被延后,并释放容器分配的线程。
可以通过AsyncContext的getRequest()、getResponse()方法取得请求、响应对象,此次对客户端的响应将暂缓至调用AsyncContext的complete()或dispatch()方法为止,前者表示响应完成,后者表示将调派指定的URL进行响应。
若要能调用ServletRequest的startAsync()以取得AsyncContext,必须告知容器此Servlet支持异步处理,如果使用@WebServlet来标注,则可以设置其asyncSupported为true。例如: @WebServlet(urlPatterns = "/some.do", asyncSupported = true) public class AsyncServlet extends HttpServlet { ... 如果使用web.xml设置Servlet,则可以在<servlet>中设置<async-supported>标签为true: ... < servlet> <servlet-name>AsyncServlet</servlet-name> <servlet-class>cc.openhome.AsyncServlet</servlet-class> <async-supported>true</async-supported> < /servlet> ...
如果Servlet将会进行异步处理,若其前端有过滤器,则过滤器亦需标示其支持异步处理,如果使用@WebFilter,同样可以设置其asyncSupported为true。例如: @WebFilter(urlPatterns = "/some.do", asyncSupported = true) public class AsyncFilter implements Filter{ ...
如果使用web.xml设置过滤器,则可以设置<async-supported>标签为true: ... < filter> <filter-name>AsyncFilter</filter-name> <filter-class>cc.openhome.AsyncFilter</filter-class> <async-supported>true</async-supported> < /filter> ...
下面示范一个异步处理的简单例子: AsyncContextDemo AsyncServlet.java package cc.openhome; import java.io.*; import java.util.concurrent.*; import javax.servlet.*; import javax.servlet.annotation.*; import javax.servlet.http.*; @WebServlet(name="AsyncServlet", urlPatterns={"/async.do"}, asyncSupported = true) public class AsyncServlet extends HttpServlet { private ExecutorService executorService = Executors.newFixedThreadPool(10); @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=UTF8"); AsyncContext ctx = request.startAsync(); executorService.submit(new AsyncRequest(ctx)); } @Override public void destroy() { executorService.shutdown(); } }
首先告诉容器,这个Servlet支持异步处理?,对于每个请求,Servlet会取得其AsyncContext?,并释放容器所分配的线程,响应被延后。对于这些被延后响应的请求,创建一个实现Runnable接口的AsyncRequest对象,并将其调度一个线程池(Thread pool)?,线程池的线程数量是固定的,让这些必须长时间处理的请求,在这些有限数量的线程中完成,而不用每次请求都占用容器分配的线程。
AsyncRequest是个实现Runnable的类,其模拟了长时间处理: AsyncContextDemo AsyncRequest.java package cc.openhome; import java.io.PrintWriter; import javax.servlet.AsyncContext; public class AsyncRequest implements Runnable { private AsyncContext ctx; public AsyncRequest(AsyncContext ctx) { this.ctx = ctx; } @Override public void run() { try { Thread.sleep(10000); PrintWriter out = ctx.getResponse().getWriter(); out.println("久等了...XD"); ctx.complete(); } catch (Exception e) { throw new RuntimeException(e); } } }
请求与响应对象都封装在AsyncContext中,所以AsyncRequest建构时必须接受AsyncContext实例。范例中以暂停线程的方式来模拟长时间处理?,并输出简单的字符串作为响应文字?,最后调用AsyncContext的complete()对客户端完成响应?。
AsyncContext简介的更多相关文章
- Servlet3.0: 简介AsyncContext
每个请求来到Web容器,Web容器会为其分配一条执行绪来专门负责该请求,直到回应完成前,该执行绪都不会被释放回容器. 执行绪会耗用系统资源,若有些请求需要长时间处理(例如长时间运算.等待某个资源),就 ...
- Spring Web MVC框架简介
Web MVC framework框架 Spring Web MVC框架简介 Spring MVC的核心是`DispatcherServlet`,该类作用非常多,分发请求处理,配置处理器映射,处理视图 ...
- ASP.NET Core 1.1 简介
ASP.NET Core 1.1 于2016年11月16日发布.这个版本包括许多伟大的新功能以及许多错误修复和一般的增强.这个版本包含了多个新的中间件组件.针对Windows的WebListener服 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- Cassandra简介
在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...
- REST简介
一说到REST,我想大家的第一反应就是“啊,就是那种前后台通信方式.”但是在要求详细讲述它所提出的各个约束,以及如何开始搭建REST服务时,却很少有人能够清晰地说出它到底是什么,需要遵守什么样的准则. ...
- Microservice架构模式简介
在2014年,Sam Newman,Martin Fowler在ThoughtWorks的一位同事,出版了一本新书<Building Microservices>.该书描述了如何按照Mic ...
- const,static,extern 简介
const,static,extern 简介 一.const与宏的区别: const简介:之前常用的字符串常量,一般是抽成宏,但是苹果不推荐我们抽成宏,推荐我们使用const常量. 执行时刻:宏是预编 ...
- HTTPS简介
一.简单总结 1.HTTPS概念总结 HTTPS 就是对HTTP进行了TLS或SSL加密. 应用层的HTTP协议通过传输层的TCP协议来传输,HTTPS 在 HTTP和 TCP中间加了一层TLS/SS ...
随机推荐
- TabLayout自定义tab,实现多样导航栏
代码地址如下:http://www.demodashi.com/demo/14660.html 前言 之前有讲过TabLayout的一些知识, TabLayout实现顶部导航(一) TabLayout ...
- uri.js的用法事例
来源于:http://smoothprogramming.com/tutorials/get-set-query-string-values-from-url-using-uri-js/ Get or ...
- java代码行数计算器
import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util. ...
- kubernetes-pod分配CPU和RAM资源以及计算方法
例子: Containers: cpu-ram-demo-container: ... image: busybox:latest resources: Limits: cpu: 1 memory: ...
- 在centos 5.5 i386 上安装 oracle 10g xe
1.安装rpm包 nano /v.sh 将下面内容复制进去 #!/bin/bash rpm -Uvh compat-db-4.2.52-5.1.i386.rpm rpm -Uvh compat-lib ...
- lucene之中文分词及其高亮显示
参考:http://www.cnblogs.com/lirenzhujiu/p/5914174.html http://www.cnblogs.com/xing901022/p/3933675.htm ...
- nginx AIO机制与sendfile机制
nginx AIO机制与sendfile机制 从0.8.11版本开始, nginx 开始支持Linux native aio,如何在nginx里配置使用这套机制是本文介绍的重点.在下面的示例配置中,几 ...
- 使用Anemometer分析MySQL慢查询记录
数据库管理员一般是用percona的toolkit工具来分析MySQL慢查询记录,但是不够直观. 下面介绍一款比较直观的工具来统计分析MySQL慢查询记录anemometer. 在使用之前需要安装pe ...
- android 点击通知栏返回应用 ,非启动一个新Activity
再使用如下的 Intent 设置: Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ ...
- 测试rp文件
正文: 测试我的博客,我的资源在github上! 地址:https://github.com/gmqllf/tx-lcn