从大面上看,异步支持。好像只是开启了一个新的线程。但是仔细推敲可以发现以下几个点:
1.服务器是多线程的,如果来一个请求,必然会为servlet开启一个线程A。
2.ctx.start之前的业务逻辑A,和ctx.start之中的业务逻辑B
3.ctx.start启动的线程B
逻辑介绍
servlet2.0始终占有资源的情况如,线程A + 业务逻辑A + 业务逻辑B
servlet3.0是先占用线程A的资源,并执行业务逻辑A;然后在ctx.start释放线程A的资源,启动一个占用资源更少的线程B执行业务逻辑B。
在大并发的情况下servlet3.0节省的资源非常可观。尤其是以下场景
业务逻辑A:占用大量内存急需释放,但云轩不耗时
业务逻辑B:需要耗时等待,占用的资源少
这个时候使用servlet3.0,就勊把业务逻辑B用线程B处理。此时有线程B负责等待,而业务逻辑A的资源和线程A的资源以及servlet的资源就可以立即释放。
下面是一个异步的例子
package com.hmkcode;
import java.io.IOException;
import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet(name = "asyncServlet", value = { "/async" }, asyncSupported = true)
public class AsyncServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 1.0 start async
final AsyncContext ctx = req.startAsync();
// 2.0 set the timeout
ctx.setTimeout(0);
// 3.0 add listener
ctx.addListener(new AsyncListener() {
public void onTimeout(AsyncEvent event) throws IOException {
System.out.println("onTimeout");
}
public void onStartAsync(AsyncEvent event) throws IOException {
System.out.println("onStartAsync");
}
public void onError(AsyncEvent event) throws IOException {
System.out.println("onError");
}
public void onComplete(AsyncEvent event) throws IOException {
System.out.println("onComplete");
}
});
// 4.0 run a thread
ctx.start(new Runnable() {
public void run() {
try {
String param = ctx.getRequest().getParameter("seq");
Thread.sleep(5000);
ctx.getResponse().getWriter().write(param);
System.out.println("ctx.end");
} catch (Exception e) {
e.printStackTrace();
}
ctx.complete();
}
});
System.out.println("done");
}
}
参考文章
http://blog.csdn.net/boli1020/article/details/16113789
分享到:
相关推荐
Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解
Servlet 是 Java EE 规范体系的重要组成部分,也是 Java 开发人员必须具备的基础...本文主要介绍了 Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、可插性支持等等,为读者顺利向新版本过渡扫清障碍
JavaEE 6Servlet 3.0 中的新特性 • 易于开发和部署 • 模块化web.xml • 动态配置 • 异步Servlet • Servlet 3.0 — 易于开发 – 主要关注点 • 增强了API 以便使用SE 5 中新的语言特性 – 例如:批注、泛型...
NULL 博文链接:https://fanshuyao.iteye.com/blog/1688318
TOMCAT 7新特性 1 使用随机数去防止跨站脚本攻击。 2 改变了安全认证中的jessionid的机制,防止session攻击。 3 内存泄露的侦测和防止 4 在war文件外使用别名去存储静态内容。 TOMCAT 7的增强...
1. 异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才 结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己 在不...
5 对Servlet 3.0,JSP 2.2和JSP-EL 2.2的支持 6 更容易将Tomcat内嵌到应用去中去,比如JBoss 7 异步日志记录 根据Mark Thomas,Tomcat 7委员会的经理的说法,Tomcat 7最显著的三个特征是Servlet 3.0,...
5. JSP 2.3支持:Tomcat 8 支持最新的JSP 2.3规范,包括对新特性和改进的支持,如EL 3.0、标签文件的静态引入等。 6. HTTP/2支持:Tomcat 8 支持HTTP/2协议,可以提供更快的页面加载速度和更高的性能。 7. NIO2支持...
Tomcat8新版本特性: 1.支持servlet3.1, jsp 2.3, el表达式3.0 and Java WebSocket 1.0. 2.默认http与ajp请求实现non-blocking技术,即NIO技术。 3.多个应用发布的时候可以先打成jar包,然后打成一个总的war发布。...
本教程为授权出品教程 《Spring注解驱动开发》是一套帮助我们深入了解Spring原理... 3).web原理 1).Servlet3.0标准新增特性 2).异步请求相关 本视频使用了maven构建程序,需要同学们有对Spring.SpringMVC的基本
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...
Spring3.0引入了众多Java开发者翘首以盼的新功能和新特性,如OXM、校验及格式化框架、REST风格的Web编程模型等。这些新功能实用性强、易用性高,可大幅降低Java应用,特别是JavaWeb应用开发的难度,同时有效提升...