厉害了,Servlet3的异步处理机制

Servlet3发布好几年了,又有多少人知道它的新特性呢?下面简单介绍下。

主要增加了以下特性:

1、异步处理支持

2、可插性支持

3、注解支持,零配置,可不用配置web.xml

...

异步处理是什么鬼?

直接操起键盘干。

@WebServlet(name = "index", urlPatterns = { "/" }, asyncSupported = true)

public class IndexServlet extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.setContentType("text/html");

try {

PrintWriter out = resp.getWriter();

out.println("servlet started.<br/>");

out.flush();

AsyncContext asyncContext = req.startAsync();

asyncContext.addListener(getListener());

asyncContext.start(new IndexThread(asyncContext));

out.println("servlet end.<br/>");

out.flush();

} catch (Exception e) {

e.printStackTrace();

}

}

/**

* 异步线程结果监听

* @author javastack

* @return

*/

private AsyncListener getListener() {

return new AsyncListener() {

public void onComplete(AsyncEvent asyncEvent) throws IOException {

asyncEvent.getSuppliedResponse().getWriter().close();

System.out.println("thread completed.");

}

public void onError(AsyncEvent asyncEvent) throws IOException {

System.out.println("thread error.");

}

public void onStartAsync(AsyncEvent asyncEvent) throws IOException {

System.out.println("thread started.");

}

public void onTimeout(AsyncEvent asyncEvent) throws IOException {

System.out.println("thread timeout.");

}

};

}

}

public class IndexThread implements Runnable {

private AsyncContext asyncContext;

public IndexThread(AsyncContext asyncContext) {

this.asyncContext = asyncContext;

}

public void run() {

try {

Thread.sleep(5000);

PrintWriter out = asyncContext.getResponse().getWriter();

out.println("hello servlet3.<br/>");

out.flush();

asyncContext.complete();

} catch (Exception e) {

e.printStackTrace();

}

}

}

访问localhost:8080/test

页面首先输出

servlet started. servlet end.

过了5秒后再输出

hello servlet3.

可以看出servlet立马返回了,但没有关闭响应流,只是把response响应传给了线程,线程再继续输出,我们可以将比较费资源消耗时间的程序放到异步去做,这样很大程序上节省了servlet资源。

Springmvc3.2开始也加入了servlet3异步处理这个特性,有兴趣的同学可以去研究下。

从上面的servlet注解也可以看出来,servlet3完全解放了web.xml配置,通过注解可以完全代替web.xml配置。

原文发布于微信公众号 - Java技术栈(javastack)

原文发表时间:2017-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android源码框架分析

Android窗口管理分析(4):Android View绘制内存的分配、传递、使用

前文Android匿名共享内存(Ashmem)原理分析了匿名共享内存,它最主要的作用就是View视图绘制,Android视图是按照一帧一帧显示到屏幕的,而每一帧...

39630
来自专栏刘望舒

Android解析WindowManager(一)WindowManager体系

前言 WindowManagerService(WMS)和AMS一样,都是Android开发需要掌握的知识点,同样的,WMS也很复杂,需要多篇文章来进行讲解,为...

22780
来自专栏GIS讲堂

Openlayers4+servlet实现切片的本地缓存

本文实现的是结合Openlayers4和java servlet实现公网资源切片的本地缓存。

20830
来自专栏Hongten

JSP 七讲

26310
来自专栏黑泽君的专栏

day52_BOS项目_04

第一步:导入pinyin4j-2.5.0.jar包,拷贝PinYin4jUtils.java工具类至utils包中 第二步:测试类代码如下:

10720
来自专栏懒人开发

Jedis的简单使用

23930
来自专栏XAI

微信二次开发Java自定义菜单事件实现

微信二次开发--java http://blog.csdn.net/lyq8479/ 这个是柳峰的CSDN博客。大家可以看大神的教程。里面有所有的代码。 项目整...

84860
来自专栏Jack的Android之旅

刨解OkHttp框架

继AsyncTask,又把手术刀指向OkHttp,有时候解析源码会上瘾。因为源码里包含的东西仿佛就是组成计算机世界的砖头,水分,只要有这些东西,就可以保罗万物,...

16720
来自专栏菩提树下的杨过

Linq2Sql数据实体外部更新时“不能添加其键已在使用中的实体”的解决办法

Linq to Sql中,如果我们想在DataContext外部修改一个实体的值,然后把引用传入到DataContext中,再利用Attach附加后更新,代码如...

29050
来自专栏清风

Tomcat 容器 POI 生成 Excel 文件 可能会使用到 temp 临时文件夹

16630

扫码关注云+社区

领取腾讯云代金券