Servlet3.0新特性(一)异步支持

从大面上看,异步支持。好像只是开启了一个新的线程。但是仔细推敲可以发现以下几个点:
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

你可能感兴趣的:(Web,xml,应用服务器,servlet,javaee)