厉害了,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配置。

目录
相关文章
|
6月前
|
存储 Java 容器
SpringMVC与Servlet3.0整合实现异步处理
SpringMVC与Servlet3.0整合实现异步处理
82 1
|
6月前
|
Java 数据库 容器
Servlet3.0中支持的异步处理
Servlet3.0中支持的异步处理
82 1
|
Java 数据库 容器
Servlet异步处理性能优化的过程
Servlet异步处理性能优化的过程
208 0
Servlet异步处理性能优化的过程
厉害了,Servlet3的异步处理机制
Servlet3发布好几年了,又有多少人知道它的新特性呢?下面简单介绍下。 主要增加了以下特性: 1、异步处理支持 2、可插性支持 3、注解支持,零配置,可不用配置web.xml ... 异步处理是什么鬼? 直接操起键盘干。
963 0
|
Java 容器 调度
Servlet 异步处理
web容器会为每个请求分配一个线程,Servlet3.0新增了异步处理,解决多个线程不释放占据内存的问题。可以先释放容器分配给请求的线程与相关资源,减轻系统负担,原先释放了容器所分配线程的请求,其响应将被延后,可以在处理完成后再对客户端进行响应。
883 0
|
3月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
35 3
|
3月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
34 1
|
3月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
54 0
|
3月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
29 0
下一篇
无影云桌面