SpringMVC与Servlet3.0异步处理(一)

Tomcat是目前较为常用的Web容器,它的连接数也是有限的,当达到其最大连接数时,再有新的请求就会被Tomcat拒绝,那么我们如何能让Tomcat在同一时间来处理更多的请求呢?

我们的Spring中为我们提供了方法进行异步处理操作的,我们之前都是用Servlet引入,然后再来学习Spring,这次也一样,我们先来看一看Servlet的同步和异步处理。

@WebServlet("/test")
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("开始请求..."+Thread.currentThread());
        doSomething();
        resp.getWriter().write("success!!!");
        System.out.println("结束请求..."+Thread.currentThread());
    }

    private void doSomething(){
        try {
            System.out.println("正在处理..."+Thread.currentThread());
            Thread.sleep(6666);     //线程睡眠,模拟处理业务耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

如上,我们就可以看出是不是一个线程在执行我们的代码,我们运行Tomcat,访问 http://localhost:8080/test ,大致等待了6-7秒的时间,我们看到了如下的页面
在这里插入图片描述
我们上面是没问题的,再看下我们的控制台打印内容
SpringMVC与Servlet3.0异步处理(一)_第1张图片
我们发现是没有问题的,从开始到结束,都是一个线程执行。然后我们将程序改为异步的,如下

@WebServlet(value = "/test", asyncSupported = true)
public class TestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /* 同步
        System.out.println("开始请求..."+Thread.currentThread());
        doSomething();
        resp.getWriter().write("success!!!");
        System.out.println("结束请求..."+Thread.currentThread());
        */

        //异步
        System.out.println("开始请求..."+Thread.currentThread());
        AsyncContext startAsync = req.startAsync();
        startAsync.start(new Runnable() {
            @Override
            public void run() {
                doSomething();

                try {
                    AsyncContext asyncContext = req.getAsyncContext();
                    ServletResponse response = asyncContext.getResponse();
                    response.getWriter().write("success!!!");
                } catch (IOException e) {
                    e.printStackTrace();
                }

                startAsync.complete();
            }
        });
        System.out.println("结束请求..."+Thread.currentThread());
    }

    private void doSomething(){
        try {
            System.out.println("正在处理..."+Thread.currentThread());
            Thread.sleep(6666);     //线程睡眠,模拟处理业务耗时
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

我们再次运行Tomcat,访问刚刚的网址,发现结果一样的,大致6-7秒会页面会显示我们输入的 succee!!!
我们在看一下后台信息
SpringMVC与Servlet3.0异步处理(一)_第2张图片
我们发现我们请求之后就直接返回请求了,并没有等待我们的业务逻辑执行完成,业务逻辑是由另一个线程进行处理的,等处理好了我们的页面才进行响应(我们在访问页面的时候,同样等待了6-7秒,不是立即返回的。)

我们在servlet中进行异步处理是,首先我们需要开启我们的异步支持
在这里插入图片描述
然后我们的请求进行异步处理,开启一个新的线程进行业务处理
SpringMVC与Servlet3.0异步处理(一)_第3张图片
我们还可以获取我们异步的上下文,用于对我们的页面的响应,同步处理我们我们直接使用HttpServletResponse resp进行处理,异步中我们需要如下处理
在这里插入图片描述
最后,我们一定要调用一个 complete()方法,表示我们异步处理结束了,要通知容器,不然我们页面可能没法及时响应,甚至报错
在这里插入图片描述

你可能感兴趣的:(SpringMVC)