4.1、异步servlet

2018-10-15  本文已影响11人  lesline

同步:接收到一个请求后,tomcat 容器提供一个线程,线程调用servlet。
异步:请求异步处理后tomcat servlet线程立刻返回,自已启动的线程执行,这样tomcat可以有较大的吞吐量。对前台来说还是同步。

@WebServlet(asyncSupported = true, urlPatterns = { "/AsyncServlet" })
public class AsyncServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    public AsyncServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
        long t1 = System.currentTimeMillis();
        // 开启异步
        AsyncContext asyncContext = request.startAsync();
        // 执行业务代码
        CompletableFuture.runAsync(() -> doSomeThing(asyncContext,
                asyncContext.getRequest(), asyncContext.getResponse()));
        System.out.println("async use:" + (System.currentTimeMillis() - t1));
    }

    private void doSomeThing(AsyncContext asyncContext, ServletRequest servletRequest, ServletResponse servletResponse) {
            // 模拟耗时操作
            TimeUnit.SECONDS.sleep(5);
            servletResponse.getWriter().append("done");

            // 业务代码处理完毕, 通知结束
            asyncContext.complete();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

代码:
git@github.com:lesline/servlet.git

上一篇下一篇

猜你喜欢

热点阅读