异步servlet

servlet从3.0开始支持异步

使用异步servlet好处在于:

一个请求,服务器启动一个servlet线程处理,直到处理完毕,服务器回收此servlet线程,要知道,servlet线程是有限的,也就是说,这个请求会一直占用着该servlet线程。遇到高并发的时候,那么服务器的处理就会遇到瓶颈;如果异步servlet进行处理的话,一个请求过来,服务器启动一个servlet线程处理,在servlet线程启动一个工作线程,然后servlet线程马上返回,继续处理其它请求。而工作线程处理完毕后,会返回给请求。

优点在于:当处理高并发,大数据量操作时候,异步处理,可以让服务器快速的接收请求,相对于同步而言,降低servlet线程阻塞的可能。


使用xml配置

1. 需要添加3.0配置如下:
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">

2. 对servlet添加异步支持:
<servlet>
        <description>**</description>
        <display-name>**</display-name>
        <servlet-name>**</servlet-name>
        <servlet-class>**/servlet-class>
        <async-supported>true</async-supported>
</servlet>

代码例子:

 @Override
    protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws IOException {
    	String asyn = req.getParameter("asyn");
        if(StringUtils.isBlank(asyn)){
            System.out.println("开始同步处理------");
            log.error("开始同步处理------");
            doSynWork(req,resp);
        }else{
            System.out.println("开始异步处理======");
            log.error("开始异步处理======");
            context = req.startAsync();
            executorService.execute(new Runnable(){
                @Override
                public void run() {
                    try {
                        doSynWork(req,resp);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }finally {
                        context.complete();
                    }
                }
            });
        }
    }


 
    
经过以上步骤,就可以实现servlet,当然也支持注解形式,这了就不再举例。

参考:http://www.infoq.com/cn/news/2013/11/use-asynchronous-servlet-improve



猜你喜欢

转载自blog.csdn.net/alen1985/article/details/50924018